React Native之获取通讯录信息并实现类通讯录列表(ios android)

React Native之获取通讯录信息并实现类通讯录列表(ios android)

一,需求分析

1,获取通讯录信息,筛选出通讯录里有多少好友在使用某个应用。

2,获取通讯录信息,实现类通讯录,可拨打电话 发短信等。

二,技术介绍与配置

2.1 技术介绍

1,react-native-contacts地址:https://www.npmjs.com/package/react-native-contacts

2,下载安装:npm install react-native-contacts --save

3,自动链接:react-native link react-native-contacts

4,react-native-contacts API介绍:

    • getAll(callback)——以对象数组的形式返回所有联系人
    • getAllWithoutPhotos——和getAll在安卓系统上是一样的,但是在iOS系统上它不会返回联系人照片的uri(因为创建这些图片会带来很大的开销)
    • getPhotoForId(contactId, callback)——返回联系人照片的URI(或null)
    • openContactForm (contact, callback)——在contactsUI中创建一个新的联系人并显示。添加一个联系人到通讯录。
    • updateContact (contact, callback)——其中contact是一个具有有效recordID的对象
    • deleteContact (contact,callback)——其中contact是一个具有有效recordID的对象
    • getContactsMatchingString (string, callback)—其中string是匹配名称(第一个、中间、家族)的任何字符串
    • checkPermission(callback)——只检查访问联系人ios的权限(仅限ios)
    • requestPermission(callback)——请求仅访问ios联系人的权限(仅限ios)

5,react-native SectionLis列表 类似FlatList的使用

 1 <SectionList
 2                     {...this.props}
 3                     style={this.props.SectionListStyle}
 4                     ref={s => this.sectionList = s}
 5                     keyExtractor={this._keyExtractor}
 6                     sections={delData}
 7                     renderSectionHeader={this._renderSectionHeader}
 8                     renderItem={this._renderItem}
 9                     getItemLayout={(data, index) => ({ length: this.props.sectionHeight, offset: 50 * index, index })}
10                 />

2.2 Android配置

第一步

在android/settings.gradle文件中添加如下代码:

1 include ‘:react-native-contacts‘
2 project(‘:react-native-contacts‘).projectDir = new File(rootProject.projectDir, ‘../node_modules/react-native-contacts/android‘)

第二步

在android/app/build.gradle文件中的dependencies标签中添加模块依赖:

1  ...
2
3  dependencies {
4
5     ...
6
7     implementation project(‘:react-native-contacts‘)    // Add this line only.
8
9  }

第三步

在MainActivity.java文件中添加如下代码:

 1 import com.rt2zz.reactnativecontacts.ReactNativeContacts;
 2
 3   ...
 4
 5   @Override
 6   protected List<ReactPackage> getPackages() {
 7       return Arrays.<ReactPackage>asList(
 8           new MainReactPackage(),
 9           new ReactNativeContacts()        // Add this line
10      );
11  }

第四步

在AndroidManifest.xml文件中添加访问通讯录权限的配置

1  <!-- 获取通讯录权限 -->
2     <uses-permission android:name="android.permission.READ_CONTACTS" />
3     <uses-permission android:name="android.permission.WRITE_CONTACTS" />
4     <uses-permission android:name="android.permission.GET_ACCOUNTS" />

然后直接react-native run-android运行即可

2.3 iOS配置

第一步

添加库到XCode的Libraries分组里

第二步

将 RCTContacts.xcodeproj下的Products文件夹中的静态库文件(.a文件,拖到Xcode General--Linked FrameworksLibraries下:

第三步

在Xcode Build Settings--Header Searchs Paths添加下:

1 $(SRCROOT)/../node_modules/react-native-contacts/ios/RCTContacts

第四步

配置访问通讯录的权限,如果不配置Privacy - Contacts Usage Description到Info.plist下,会出现闪退情况。在Info.plist添加如下:

1 <key>NSContactsUsageDescription</key>
2     <string>访问通讯录</string>

下面直接react-native run-ios即可运行,或直接在Xcode里 running

三,实现

3.1 实现的效果

3.2 iOS Android 验证和请求访问权限

Android直接可以使用react-native 自带的API验证。而iOS需要第三方验证权限。

 1 requestCONTACTS = () => {
 2     let self = this;
 3     if (Platform.OS === ‘android‘) {
 4       PermissionsAndroid.check(PermissionsAndroid.PERMISSIONS.READ_CONTACTS).then(res => {
 5         if (!res || res !== ‘granted‘) {
 6           PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.READ_CONTACTS, {
 7             ‘title‘: ‘申请读取通讯录权限‘,
 8             ‘message‘: ‘一个很牛逼的应用想借用你的通讯录,‘ +
 9               ‘然后你就可以炫出自己的通讯啦。‘
10           })
11             .then(res => {
12               if (res !== ‘granted‘) {
13                 Alert.alert(‘访问通讯录权限没打开‘, ‘请在iPhone的“设置-隐私”选项中,允许访问您的通讯录‘)
14               }
15               else {
16
17                 self.onButtonPressed()
18               };
19             });
20         }
21         else {
22           self.onButtonPressed()
23         };
24       });
25
26     } else {
27       if (Contacts) {
28         Contacts.checkPermission((err, permission) => {
29           if (err) throw err;
30           // Contacts.PERMISSION_AUTHORIZED || Contacts.PERMISSION_UNDEFINED || Contacts.PERMISSION_DENIED
31           if (permission === ‘undefined‘) {
32             Contacts.requestPermission((err, permission) => {
33               if (err) throw err;
34               if (permission === ‘authorized‘) {
35                 // 同意!
36                 self.onButtonPressed()
37               }
38               if (permission === ‘denied‘) {
39                 // 拒绝
40                 Alert.alert(‘访问通讯录权限没打开‘, ‘请在iPhone的“设置-隐私”选项中,允许访问您的通讯录‘)
41               }
42             })
43           }
44           if (permission === ‘authorized‘) {
45             // 同意!
46             self.onButtonPressed()
47           }
48           if (permission === ‘denied‘) {
49             // 已经拒绝
50             Alert.alert(‘访问通讯录权限没打开‘, ‘请在iPhone的“设置-隐私”选项中,允许访问您的通讯录‘)
51           }
52         })
53       }
54     }
55   }

3.3 获取通讯录列表

1 onButtonPressed() {
2     let self = this;
3     Contacts.getAll((err, contacts) => {
4       if (err) throw err;
5       alert(JSON.stringify(contacts));//通讯录列表
6     })
7   }

3.4 修改通讯录信息

 1 updateContact(contacts){
 2 let someRecord = contacts
 3   someRecord.phoneNumbers.push({
 4     label: "mobile",
 5     number: "12345678901",
 6   })
 7 someRecord.givenName = ‘李四‘
 8   Contacts.updateContact(someRecord, (err) => {
 9     if (err) throw err;
10     // record updated
11   })
12 }

3.5 添加通讯录信息

 1 openContactForm(){
 2 var newPerson = {
 3   phoneNumbers: [{
 4     label: "mobile",
 5     number: "15422234567",
 6   }],
 7   familyName: "张",
 8   givenName: "张三",
 9 }
10
11 Contacts.openContactForm(newPerson, (err) => {
12   if (err) throw err;
13   // form is open
14 })
15 }

3.6 删除通讯录

1 deleteContact(contacts){
2 //delete the second record
3   Contacts.deleteContact(contacts, (err, recordId) => {
4     if (err) throw err;
5     // contact deleted
6   })
7 }

3.7 实现类通讯录列表

ContactsList自定义的一个组件,类通讯录+字母导航,点击可滚动到对应的位置。(如需完整代码 请留言评论)

 1 import Contacts from ‘react-native-contacts‘;
 2 import ContactsList from ‘./ContactsList/index‘
 3
 4 <View style={{ flex: 1,backgroundColor:‘white‘,paddingTop:20,paddingBottom:20 }}>
 5
 6      <ContactsList
 7           ref={s => this.sectionList = s}
 8           sectionListData={this.state.ContactsArray}
 9           sectionHeight={50}
10           initialNumToRender={this.state.ContactsArray.length}
11           showsVerticalScrollIndicator={false}
12           SectionListClickCallback={(item, index) => {
13            self.onDialingAction(item.number)
14           }}
15           otherAlphabet="#"
16         />
17       </View>

3.8 拨打电话

 1  onDialingAction = (telephone) => {
 2     let url = ‘tel: ‘ + telephone
 3     Linking.canOpenURL(url).then(supported => {
 4         if (!supported) {
 5             Toast.show(‘您的系统不支持打电话!‘)
 6         } else {
 7             return Linking.openURL(url);
 8         }
 9     }).catch(err => { });
10 }

3.9 发送短信

 1  onSendMessage = (telephone) => {
 2     let url = ‘smsto: ‘ + telephone
 3     Linking.canOpenURL(url).then(supported => {
 4         if (!supported) {
 5             Toast.show(‘您的系统不支持发送短信!‘)
 6         } else {
 7             return Linking.openURL(url);
 8         }
 9     }).catch(err => { });
10 }

3.10 筛选出通讯录里有多少好友正在在使用某个应用

这个功能需要后台配合,在这儿就不做过多赘述啦!

原文地址:https://www.cnblogs.com/jackson-zhangjiang/p/9562624.html

时间: 2024-10-02 21:55:17

React Native之获取通讯录信息并实现类通讯录列表(ios android)的相关文章

获取手机信息的工具类PhoneHelper

PhoneHelper 获取手机的一些基本信息,比如生产商家.固件版本.手机型号.手机号码.屏幕分辨率等 代码如下 import java.io.File; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import android.content.Context; import android.content.Intent; import android.conten

React Native初探

前言 很久之前就想研究React Native了,但是一直没有落地的机会,我一直认为一个技术要有落地的场景才有研究的意义,刚好最近迎来了新的APP,在可控的范围内,我们可以在上面做任何想做的事情. PS:任何新技术的尝鲜都一定要控制在自己能控制的范围内,失败了会有可替换方案,不要引起不可逆的问题,这样会给团队造成灾难性的后果. 事实上,RN经过一段时间发展,已经有充分数量的人尝试过了,就我身边就有几批,褒贬也不一: ① 做UI快 ② 还是有很多限制,不如原生Native ③ 入门简单,能让前端快

配置React Native环境及解决运行异常

一. 安装Homebrew: Homebrew的官网(多语言版本)简单明了地介绍了如何安装和使用这个工具,;并提供了自己的Wiki. brew的安装很简单,使用一条ruby命令即可,Mac系统上已经默认安装了ruby": ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 等待一段时间后会出现     Press RETURN to continue

React Native专题-江清清

本React Native讲解专题:主要讲解了React Native开发,由基础环境搭建配置入门,基础,进阶相关讲解. 刚创建的React Native交流8群:533435865  欢迎各位大牛,React Native技术爱好者加入交流!同时博客右侧欢迎微信扫描关注订阅号,移动技术干货,精彩文章技术推送! 关于React Native各种疑难杂症,问题深坑总结方案请点击查看: Mac和Windows安装搭建React Native环境教程如下: Mac OS X版本:Mac OS X安装R

React Native 从零到高级- 0基础学习路线

React Native QQ交流群(美团,饿了么,阿里的大神都在里面):576089067 React Native  从0 基础到高级 视频教程正在重录中,要了解最新进度可以关注菜鸟窝微信公众号(下图),旧版视频教程可以点击这里在线学习 学习路线(文章版),江清清老师出品,点击这里关注江清清 ,同时可以关注一下他的课程 基础入门:1.React Native For Android环境配置以及第一个实例2.React Native开发IDE安装及配置3.React Native应用设备运行(

配置React Native环境

一. 安装Homebrew: “Homebrew installs the stuff you need that Apple didn’t.——Homebrew  OS X 更完整”. Homebrew的官网(多语言版本)简单明了地介绍了如何安装和使用这个工具,;并提供了自己的Wiki. brew的安装很简单,使用一条ruby命令即可,Mac系统上已经默认安装了ruby": ruby -e "$(curl -fsSL https://raw.githubusercontent.com

React Native专题

刚创建的React Native技术交流1群(282693535),React Native技术交流2群(496601483),React Native技术交流3群(496508742).欢迎各位大牛,React Native技术爱好者加入交流!同时博客右侧欢迎微信扫描关注订阅号,移动技术干货,精彩文章技术推送! 关于React Native各种疑难杂症,问题深坑总结方案请点击查看: Mac和Windows安装搭建React Native环境教程如下: Mac OS X版本:Mac OS X安装

Java——ProcessBuilder类的使用及获取APK信息

这次是想获取APK包的版本号,包名,大小等信息.其实有两种方法: 一种是: 纯JAVA环境获取APK信息(包名,版本,版本号,大小,权限...),纯JAVA语言编写PC端获取APK信息 . 这篇文章是通过解析APK中的xml获取信息的. 其实还有另外一种方法是使用android开发工具里面的aapt.exe文件, C:/getapkinfo/aapt.exe d badging D:/new/test.apk 指定好aapt文件的路径  后面两个为参数  后面为apk包的位置. 这是在Dos窗口

React Native v0.4 发布,用 React 编写移动应用

React Native v0.4 发布,自从 React Native 开源以来,包括超过 12.5k stars,1000 commits,500 issues,380 pull requests 和 100 贡献者,还有 35 款插件 和 1 个 AppStore 应用! 直击现场 <HTML开发MacOSApp教程>  http://pan.baidu.com/s/1jG1Q58M 此版本主要改进如下: 错误信息和文档:添加了大量的警告信息,更新了文档,修复了大量的 bug 兼容 NP