zoukankan      html  css  js  c++  java
  • react-native-contact 安卓已测试,

    1. 下载模块    npm install react-native-contacts --save

    2.安卓配置:

      a.在android/settings.gradle

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

      b.在android/app/build.gradle  

        dependencies {
            ...
            implementation project(':react-native-contacts')
        }
     
      c.注册模块 (in MainApplication.java)
        
         import com.rt2zz.reactnativecontacts.ReactNativeContacts; // <--- import 
     
         public class MainActivity extends ReactActivity {
            ......
     
            @Override
            protected List<ReactPackage> getPackages() {
                return Arrays.<ReactPackage>asList(
                        new MainReactPackage(),
                        new ReactNativeContacts()); // <------ add this 
            }
          ......
        }
     
      d.在AndroidManifest.xml中设置权限
      
    <uses-permission android:name="android.permission.READ_PROFILE" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.WRITE_CONTACTS" />
     
      e.如果设置了Proguard,就在proguard-rules.pro中添加
    -keep class com.rt2zz.reactnativecontacts.** {*;}
    -keepclassmembers class com.rt2zz.reactnativecontacts.** {*;}
     
     
    3.ios配置
      a. 右击Libraries,选择Add Files to “” --> 文件的node-modules ---> react-native-contact ---> ios --> RCTContacts.xcodeproj,成功后会显示在Libraries中
      

      b.

     c.在Info.plist中. 添加 Privacy - Contacts Usage Description
     
     
    附上一段参考的代码,简单的获取本地,已测试:
      
    /**
     * Sample React Native App
     * https://github.com/facebook/react-native
     *
     * @format
     * @flow
     */
    
    import React, {Component} from 'react';
    import {TouchableOpacity, PermissionsAndroid, Platform, SectionList, StyleSheet, Text, View, ScrollView, Image, PixelRatio} from 'react-native';
    import {Actions, Router, Scene,} from 'react-native-router-flux';
    import Contacts from 'react-native-contacts';
    import { Container, Header, Content, List, ListItem, } from 'native-base';
    
    
    
    
    
    export default class Contact extends Component {
        constructor(props) {
            super (props);
            this.state = {
                contactData: [], // 通讯录列表
            }
        }
        componentDidMount() {
            // this.requestCONTACTS()
        }
    
        requestCONTACTS = () => {
            let self = this;
            if (Platform.OS === 'android') {
                PermissionsAndroid.check(PermissionsAndroid.PERMISSIONS.READ_CONTACTS).then(res => {
                    if (!res || res !== 'granted') {
                        console.log('我走进11')
                        PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.READ_CONTACTS, {
                            'title': '申请读取通讯录权限',
                            'message': '获取通讯录权限,' +
                                '
                        })
                            .then(res => {
                                console.log('我走进22')
    
                                console.log(res, '数组吗')
                                if (res !== 'granted') {
                                    console.log('我走进33')
                                    Alert.alert('访问通讯录权限没打开', '请在iPhone的“设置-隐私”选项中,允许访问您的通讯录')
                                }
                                else {
                                    console.log('我走进44')
                                    self.onButtonPressed()
                                };
                            });
                    }
                    else {
                        console.log('我走进55')
                        self.onButtonPressed()
                    };
                });
    
            } else {
                console.log('我走进66,ios')
                console.log(Contacts, 'Contacts')
                if (Contacts) {
                    Contacts.checkPermission((err, permission) => {
                        console.log('我走进77,ios')
                        if (err) throw err;
                        // Contacts.PERMISSION_AUTHORIZED || Contacts.PERMISSION_UNDEFINED || Contacts.PERMISSION_DENIED
                        if (permission === 'undefined') {
                            Contacts.requestPermission((err, permission) => {
                                console.log('我走进88,ios')
                                if (err) throw err;
                                if (permission === 'authorized') {
                                    console.log('我走进99,ios')
                                    // 同意!
                                    self.onButtonPressed()
                                }
                                if (permission === 'denied') {
                                    console.log('我走进100,ios')
                                    // 拒绝
                                    Alert.alert('访问通讯录权限没打开', '请在iPhone的“设置-隐私”选项中,允许访问您的通讯录')
                                }
                            })
                        }
                        if (permission === 'authorized') {
                            console.log('我走进110,ios')
                            // 同意!
                            self.onButtonPressed()
                        }
                        if (permission === 'denied') {
                            console.log('我走进120,ios')
                            // 已经拒绝
                            Alert.alert('访问通讯录权限没打开', '请在iPhone的“设置-隐私”选项中,允许访问您的通讯录')
                        }
                    })
                }
            }
        }
    
        // 获取通讯录列表
        onButtonPressed() {
            let self = this;
            Contacts.getAll((err, contacts) => {
                console.log('我点击了')
                if (err) throw err;
                this.setState({
                    contactData: contacts
                })
                console.log(contacts instanceof Array);//通讯录列表
            })
        }
    
        // 修改通讯录信息
        updateContact(contacts){
            let someRecord = contacts
            someRecord.phoneNumbers.push({
                label: "mobile",
                number: "12345678901",
            })
            someRecord.givenName = '李四'
            Contacts.updateContact(someRecord, (err) => {
                if (err) throw err;
                // record updated
            })
        }
    
    
        // 添加通讯录信息
        updateContact(contacts){
            let someRecord = contacts
            someRecord.phoneNumbers.push({
                label: "mobile",
                number: "12345678901",
            })
            someRecord.givenName = '李四'
            Contacts.updateContact(someRecord, (err) => {
                if (err) throw err;
                // record updated
            })
        }
    
        // 删除通讯录
        deleteContact(contacts){
    //delete the second record
            Contacts.deleteContact(contacts, (err, recordId) => {
                if (err) throw err;
                // contact deleted
            })
        }
    
        // 拨打电话
        onDialingAction = (telephone) => {
            let url = 'tel: ' + telephone
            Linking.canOpenURL(url).then(supported => {
                if (!supported) {
                    Toast.show('您的系统不支持打电话!')
                } else {
                    return Linking.openURL(url);
                }
            }).catch(err => { });
        }
    
        // 发送短信
        onSendMessage = (telephone) => {
            let url = 'smsto: ' + telephone
            Linking.canOpenURL(url).then(supported => {
                if (!supported) {
                    Toast.show('您的系统不支持发送短信!')
                } else {
                    return Linking.openURL(url);
                }
            }).catch(err => { });
        }
    
        sel = (val) => {
            for (let i = 0; i < val.phoneNumbers.length; i++) {
                if (val.phoneNumbers[i].label !== "other") {
                    alert(val.phoneNumbers[i].number, '这个是联系方式')
    
                }
            }
    
        }
        render() {
            let {contactData} = this.state;
            // console.log(contactData.splice(1, 10))
            console.log( contactData.splice(1, 10))
            return (
                <View style={styles.container}>
                    <Text onPress={this.requestCONTACTS}>11</Text>
                    <View style={{height: '80%'}}>
                        <Content>
                            {/*<List>*/}
                                {
                                    contactData.length > 0 ? contactData.splice(1, 10).map((val, i) => {
                                        return (
                                            <List key={i}>
                                                <ListItem itemDivider>
                                                    <Text>A</Text>
                                                </ListItem>
                                                <ListItem>
                                                    <Text onPress={() => this.sel(val)}>{val.familyName}</Text>
                                                </ListItem>
                                            </List>
                                        )
    
                                     }) : <Text>通讯录为空</Text>
                                 }
                        </Content>
                    </View>
                </View>
            );
        }
    }
    
    
    
    
    const styles = StyleSheet.create({
        container: {
            // flex: 1,
            // backgroundColor: 'red',
            padding: 20,
            marginTop: 20,
        },
        flex: {
            flexDirection: 'row',
            alignItems: 'center',
        },
    
    
    });
     
     
     
     
  • 相关阅读:
    【平衡规划】JZOJ4616. 【NOI2016模拟7.12】二进制的世界
    函数中,如何修改形参的默认值
    默认形参在函数定义阶段就已经被赋值,在调用时就可以不用再次赋值了。
    在函数调用时:位置形参、位置实参、关键字实参的特点
    return之为什么能够终止函数,代码演练
    深度理解return具体用法
    函数基础重点掌握内容:创建函数、return返回单个值、return返回多个值、函数名加括号与不加括号的区别
    python之encode和decode编码
    python利用setsockopt获得端口重用
    python并发之多进程
  • 原文地址:https://www.cnblogs.com/lude1994/p/10833511.html
Copyright © 2011-2022 走看看