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的使用

 <SectionList
{...this.props}
style={this.props.SectionListStyle}
ref={s => this.sectionList = s}
keyExtractor={this._keyExtractor}
sections={delData}
renderSectionHeader={this._renderSectionHeader}
renderItem={this._renderItem}
getItemLayout={(data, index) => ({ length: this.props.sectionHeight, offset: 50 * index, index })}
/>

2.2 Android配置

第一步

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

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

第二步

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

  ...

  dependencies {

     ...

     implementation project(':react-native-contacts')    // Add this line only.

  }

第三步

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

 import com.rt2zz.reactnativecontacts.ReactNativeContacts;

   ...

   @Override
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new MainReactPackage(),
new ReactNativeContacts() // Add this line
);
}

第四步

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

  <!-- 获取通讯录权限 -->
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<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添加下:

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

第四步

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

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

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

三,实现

3.1 实现的效果

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

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

 requestCONTACTS = () => {
let self = this;
if (Platform.OS === 'android') {
PermissionsAndroid.check(PermissionsAndroid.PERMISSIONS.READ_CONTACTS).then(res => {
if (!res || res !== 'granted') {
PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.READ_CONTACTS, {
'title': '申请读取通讯录权限',
'message': '一个很牛逼的应用想借用你的通讯录,' +
'然后你就可以炫出自己的通讯啦。'
})
.then(res => {
if (res !== 'granted') {
Alert.alert('访问通讯录权限没打开', '请在iPhone的“设置-隐私”选项中,允许访问您的通讯录')
}
else { self.onButtonPressed()
};
});
}
else {
self.onButtonPressed()
};
}); } else {
if (Contacts) {
Contacts.checkPermission((err, permission) => {
if (err) throw err;
// Contacts.PERMISSION_AUTHORIZED || Contacts.PERMISSION_UNDEFINED || Contacts.PERMISSION_DENIED
if (permission === 'undefined') {
Contacts.requestPermission((err, permission) => {
if (err) throw err;
if (permission === 'authorized') {
// 同意!
self.onButtonPressed()
}
if (permission === 'denied') {
// 拒绝
Alert.alert('访问通讯录权限没打开', '请在iPhone的“设置-隐私”选项中,允许访问您的通讯录')
}
})
}
if (permission === 'authorized') {
// 同意!
self.onButtonPressed()
}
if (permission === 'denied') {
// 已经拒绝
Alert.alert('访问通讯录权限没打开', '请在iPhone的“设置-隐私”选项中,允许访问您的通讯录')
}
})
}
}
}

3.3 获取通讯录列表

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

3.4 修改通讯录信息

 updateContact(contacts){
let someRecord = contacts
someRecord.phoneNumbers.push({
label: "mobile",
number: "12345678901",
})
someRecord.givenName = '李四'
Contacts.updateContact(someRecord, (err) => {
if (err) throw err;
// record updated
})
}

3.5 添加通讯录信息

 openContactForm(){
var newPerson = {
phoneNumbers: [{
label: "mobile",
number: "15422234567",
}],
familyName: "张",
givenName: "张三",
} Contacts.openContactForm(newPerson, (err) => {
if (err) throw err;
// form is open
})
}

3.6 删除通讯录

 deleteContact(contacts){
//delete the second record
Contacts.deleteContact(contacts, (err, recordId) => {
if (err) throw err;
// contact deleted
})
}

3.7 实现类通讯录列表

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

 import Contacts from 'react-native-contacts';
import ContactsList from './ContactsList/index' <View style={{ flex: 1,backgroundColor:'white',paddingTop:20,paddingBottom:20 }}> <ContactsList
ref={s => this.sectionList = s}
sectionListData={this.state.ContactsArray}
sectionHeight={50}
initialNumToRender={this.state.ContactsArray.length}
showsVerticalScrollIndicator={false}
SectionListClickCallback={(item, index) => {
self.onDialingAction(item.number)
}}
otherAlphabet="#"
/>
</View>

3.8 拨打电话

  onDialingAction = (telephone) => {
let url = 'tel: ' + telephone
Linking.canOpenURL(url).then(supported => {
if (!supported) {
Toast.show('您的系统不支持打电话!')
} else {
return Linking.openURL(url);
}
}).catch(err => { });
}

3.9 发送短信

  onSendMessage = (telephone) => {
let url = 'smsto: ' + telephone
Linking.canOpenURL(url).then(supported => {
if (!supported) {
Toast.show('您的系统不支持发送短信!')
} else {
return Linking.openURL(url);
}
}).catch(err => { });
}
   let body='测试发送短信!'
let url = 'smsto: ' + telephone
if(Platform.OS === 'android') body = encodeURIComponent(body);
url += Platform.OS === 'ios' ? `&body=${encodeURIComponent(body)}` : `?body=${encodeURIComponent(body)}`;
Linking.canOpenURL(url).then(supported => {
if (!supported) {
Toast.show('您的系统不支持发送短信!')
} else {
return Linking.openURL(url);
}
}).catch(err => { });

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

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

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

  1. React Native(五)——获取设备信息react-native-device-info

    心酸史: 自从接触rn开始后,越来越多的引入第三方组件而开始的配置文件,让自己一再头疼: 明明是按照官方文档一步一步的配置,为什么别人可以做到的自己却屡屡出错,真是哭笑不得--从微信分享react-n ...

  2. react native 之 获取键盘高度

    多说不如多撸: /** * Created by shaotingzhou on 2017/2/23. *//** * Sample React Native App * https://github ...

  3. 封装获取网络信息Linux—API类

    封装获取网络信息Linux—API类 封装好的库: #ifndef NETINFORMATION_H #define NETINFORMATION_H #include <netdb.h> ...

  4. Facebook 开源安卓版 React Native,开发者可将相同代码用于网页和 iOS 应用开发

    转自:http://mt.sohu.com/20150915/n421177212.shtml Facebook 创建了React Java 库,这样,Facebook 的工程团队就可以用相同的代码给 ...

  5. React Native学习(七)—— FlatList实现横向滑动列表效果

    本文基于React Native 0.52 Demo上传到Git了,有需要可以看看,写了新内容会上传的.Git地址 https://github.com/gingerJY/React-Native-D ...

  6. 《React Native 精解与实战》书籍连载「配置 iOS 与 Android 开发环境」

    此文是我的出版书籍<React Native 精解与实战>连载分享,此书由机械工业出版社出版,书中详解了 React Native 框架底层原理.React Native 组件布局.组件与 ...

  7. React Native原生模块向JS传递数据的几种方式(Android)

    一般情况可以分为三种方式: 1. 通过回调函数Callbacks的方式 2. 通过Promises的异步的方式 3. 通过发送事件的事件监听的方式. 参考文档:传送门

  8. react native 获取 软键盘高度 和 新增软键盘的组件

    import React, { Component } from 'react'; import { AppRegistry, StyleSheet, Text, View, Keyboard, Te ...

  9. React Native初探

    前言 很久之前就想研究React Native了,但是一直没有落地的机会,我一直认为一个技术要有落地的场景才有研究的意义,刚好最近迎来了新的APP,在可控的范围内,我们可以在上面做任何想做的事情. P ...

随机推荐

  1. Python中进程线程协程小结

    进程与线程的概念 进程 程序仅仅只是一堆代码而已,而进程指的是程序的运行过程.需要强调的是:同一个程序执行两次,那也是两个进程. 进程:资源管理单位(容器). 线程:最小执行单位,管理线程的是进程. ...

  2. js模块化规范—概念和模块化进化史以及模块化的问题

    模块的概念 一个复杂的项目开发中,会写很多js文件,一个js文件执行某些特定的功能,那么每个js都可以称为一个模块,这就是模块的概念 每个js模块内部数据/实现是私有的, 只是向外部暴露一些接口(方法 ...

  3. fabric使用

    1.入门博客https://fabric-chs.readthedocs.io/zh_CN/chs/tutorial.html 如果遇到这个问题说明你的fabric版本太高了 卸载到现在版本重新安装就 ...

  4. zabbix全网监控

    为什么要监控 运维的职责1.保障企业数据的安全可靠.2.为客户提供7*24小时服务.3.不断提升用户的体验. 在关键时刻,提前提醒我们服务器要出问题了 当出问题之后,可以便于找到问题的根源 拿到公司服 ...

  5. tensorflow 模型保存与加载 和TensorFlow serving + grpc + docker项目部署

    TensorFlow 模型保存与加载 TensorFlow中总共有两种保存和加载模型的方法.第一种是利用 tf.train.Saver() 来保存,第二种就是利用 SavedModel 来保存模型,接 ...

  6. SPA游标采集之去除重复

    注:转:http://shsnc2014.blog.163.com/blog/static/2403690822014102411217903/ 当我们做数据库升级项目的时候,我们一般会去做性能回归测 ...

  7. java让数字显示千分位 mark

    /** * 格式化数字为千分位显示: * @param 要格式化的数字: * @return */ public static String fmtMicrometer(String text) { ...

  8. (二 -3-3) 天猫精灵接入Home Assistant-自动发现Mqtt设备-自动生成配置信息

    http://www.hassmart.com/products/switches/#tab=config switch: - platform: mqtt name: keting state_to ...

  9. 无备份时用dbms_repair恢复坏块的方法

    份的情况下可以直接使用备份来恢复. 对于通过备份恢复,Oracel为我们提供了很多种方式,冷备,基于用户管理方式,RMAN方式等等. 对于这几种方式我们需要实现基于数据库以及文件级别的恢复.RMAN同 ...

  10. Android root检测方法小结

    转载目的,之前主要应用这里的原理解决了,手机被某个APP检测为root过的手机的问题,记录后续可能参考. 出于安全原因,我们的应用程序不建议在已经root的设备上运行,所以需要检测是否设备已经root ...