美文网首页
uniapp 调用原生手机联系人以获取手机联系人

uniapp 调用原生手机联系人以获取手机联系人

作者: 深渊凝视 | 来源:发表于2022-09-17 11:20 被阅读0次

uniAPP 调用手机联系人

  • 功能需求描述
    1 一般在设置收货地址/添加联系方式时,可以手动输入,也可以直接获取手机的联系人
    2 方法一:通过HTML5 API中的plus.contacts.ADDRESSBOOK_PHONE获取联系人信息自定义列表
    3 方法二:通过Native.js调用原生API适配iosandroid
功能需求描述
一般在设置收货地址/添加联系方式时,可以手动输入,也可以直接获取手机的联系人
方法一:通过HTML5 API中的plus.contacts.ADDRESSBOOK_PHONE获取联系人信息自定义列表
getContacts: function() {
                var that = this
                // 获取通讯录对象
                plus.contacts.getAddressBook( plus.contacts.ADDRESSBOOK_PHONE, function( addressbook ) {
                    uni.showToast({
                        title: '获取通讯录对象成功',
                        duration: 2000
                    })
                    console.log('获取通讯录对象成功')
                    console.log(addressbook)
                    // 查找联系人
                    addressbook.find(["displayName","phoneNumbers"],function(contacts){
                        uni.showToast({
                            title: '获取联系人成功',
                            duration: 2000
                        })
                        console.log('获取联系人成功')
                        console.log(JSON.stringify(contacts))
                        that.list = contacts
                    }, function () {
                        uni.showToast({
                            title: '获取联系人失败',
                            duration: 2000
                        })
                    },{multiple:true});
                }, function ( e ) {
                    uni.showToast({
                        title: '获取通讯录对象失败:' + e.message,
                        duration: 2000
                    })
                });
}
方法二:通过Native.js调用原生API适配ios和android
/**
 * nativeCommon,通过Native.js调用原生API
 * 选择通讯录电话
 */
 var nativeCommon = {
    /**
     * 通讯录模块
     */
    contacts: {
        getContact: function(callBack) {
            switch (plus.os.name) {
                case "iOS":
                    if (plus.device.model === "iPhoneSimulator") {
                        //模拟器
                        nativeCommon.contacts.ios.visitContacts(function(name, phoneNumber) {
                            callBack(name, phoneNumber);
                        });
                    } else {
                        //真机
                        nativeCommon.contacts.ios.visitAddressBook(function(name, phoneNumber) {
                            callBack(name, phoneNumber);
                        });
                    }
                    break;
                case "Android":
                    // Android通过plus.contacts.getAddressBook可弹出通讯录授权提示框
                    // nativeCommon.contacts.android.visitContacts(function(name, phoneNumber) {
                    //  callBack(name, phoneNumber);
                    // });
                    plus.contacts.getAddressBook(plus.contacts.ADDRESSBOOK_PHONE, function(addressbook) {
                        nativeCommon.contacts.android.visitContacts(function(name, phoneNumber) {
                            callBack(name, phoneNumber);
                        });
                    }, function(e) {
                        plus.nativeUI.alert("Get address book failed: " + e.message);
                    });
                    break;
                default:
                    break;
            }
        },
        ios: { //供iOS系统调用
            /**
             * 访问通讯录,将获取的联系人信息通过callBack返回
             * 仅限模拟器使用(Native.js 的bug)
             * @param {Object} callBack回调
             */
            visitContacts: function(callBack) {
                var contactPickerVC = plus.ios.newObject("CNContactPickerViewController");
                //实现代理方法【- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact;】
                //同时生成遵守CNContactPickerDelegate协议的代理对象delegate
                var delegate = plus.ios.implements("CNContactPickerDelegate", {
                    "contactPicker:didSelectContact:": function(picker, contact) {
                        //姓名
                        var name = "";
                        //姓氏
                        var familyName = contact.plusGetAttribute("familyName");
                        //名字
                        var givenName = contact.plusGetAttribute("givenName");
                        name = familyName + givenName;
                        //电话号码
                        var phoneNo = "";
                        var phoneNumbers = contact.plusGetAttribute("phoneNumbers");
                        if (phoneNumbers.plusGetAttribute("count") > 0) {
                            var phone = phoneNumbers.plusGetAttribute("firstObject");
                            var phoneNumber = phone.plusGetAttribute("value");
                            phoneNo = phoneNumber.plusGetAttribute("stringValue");
                        }
                        if (callBack) {
                            callBack(name, phoneNo);
                        }
                    }
                });
                //给通讯录控制器contactPickerVC设置代理
                plus.ios.invoke(contactPickerVC, "setDelegate:", delegate);
                //获取当前UIWebView视图
                var currentWebview = plus.ios.currentWebview();
                //根据当前UIWebView视图获取当前控制器
                var currentVC = nativeCommon.contacts.ios.getViewControllerByView(currentWebview);
                //由当前控制器present到通讯录控制器
                plus.ios.invoke(currentVC, "presentViewController:animated:completion:", contactPickerVC, true,
                    null);
            },
            /**
             * 访问通讯录,将获取的联系人信息通过callBack返回
             * 仅限真机使用(Native.js 的bug)
             * @param {Object} callBack
             */
            visitAddressBook: function(callBack) {
                var peoplePickerNavController = plus.ios.newObject("ABPeoplePickerNavigationController");
                //实现代理方法【- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person;】
                //同时生成遵守ABPeoplePickerNavigationControllerDelegate协议的代理对象peoplePickerDelegate
                var peoplePickerDelegate = plus.ios.implements("ABPeoplePickerNavigationControllerDelegate", {
                    "peoplePickerNavigationController:didSelectPerson:": function(peoplePicker,
                    person) {
                        //这里的peoplePicker竟然是CNContact实例对象,person是undefined
                        console.log(JSON.stringify(peoplePicker));
                        console.log(JSON.stringify(person));
                        console.log(typeof person);

                        //所以之前的代码不用改
                        var contact = peoplePicker;
                        //姓名
                        var name = "";
                        //姓氏
                        var familyName = contact.plusGetAttribute("familyName");
                        //名字
                        var givenName = contact.plusGetAttribute("givenName");
                        name = familyName + givenName;
                        //电话号码
                        var phoneNo = "";
                        var phoneNumbers = contact.plusGetAttribute("phoneNumbers");
                        if (phoneNumbers.plusGetAttribute("count") > 0) {
                            var phone = phoneNumbers.plusGetAttribute("firstObject");
                            var phoneNumber = phone.plusGetAttribute("value");
                            phoneNo = phoneNumber.plusGetAttribute("stringValue");
                        }
                        if (callBack) {
                            callBack(name, phoneNo);
                        }
                    }
                });
                //给通讯录控制器peoplePickerNavController设置代理
                plus.ios.invoke(peoplePickerNavController, "setPeoplePickerDelegate:", peoplePickerDelegate);
                //获取当前UIWebView视图
                var UIApplicationClass = plus.ios.importClass("UIApplication");
                var UIAppObj = UIApplicationClass.sharedApplication();
                var del = plus.ios.invoke(UIAppObj, "delegate");
                var appWindowObj = plus.ios.invoke(del, "window");
                var appRootController = plus.ios.invoke(appWindowObj, "rootViewController");
                //由当前控制器present到通讯录控制器
                plus.ios.invoke(appRootController, "presentViewController:animated:completion:",
                    peoplePickerNavController, true,
                    null);
            }
        },
        android: { //供android系统调用
            visitContacts: function(callBack) {
                plus.contacts.getAddressBook(plus.contacts.ADDRESSBOOK_PHONE, (book) => {
                    var REQUESTCODE = 1000;
                    var main = plus.android.runtimeMainActivity();
                    var Intent = plus.android.importClass('android.content.Intent');
                    var ContactsContract = plus.android.importClass(
                    'android.provider.ContactsContract');
                    var intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
                    main.onActivityResult = function(requestCode, resultCode, data) {
                        if (REQUESTCODE == requestCode) {
                            var phoneNumber = "";
                            var resultString = "";
                            var context = main;
                            plus.android.importClass(data);
                            var contactData = data.getData();
                            var resolver = context.getContentResolver();
                            plus.android.importClass(resolver);
                            var cursor = resolver.query(contactData, null, null, null, null);
                            plus.android.importClass(cursor);
                            cursor.moveToFirst();
                            //姓名
                            var givenName = cursor.getString(cursor.getColumnIndex(ContactsContract
                                .Contacts.DISPLAY_NAME)) || "";
                            var contactId = cursor.getString(cursor.getColumnIndex(ContactsContract
                                .Contacts._ID));
                            var pCursor = resolver.query(ContactsContract.CommonDataKinds.Phone
                                .CONTENT_URI, null, ContactsContract.CommonDataKinds
                                .Phone.CONTACT_ID + " = " + contactId, null, null);
                            if (pCursor.moveToNext()) {
                                phoneNumber = pCursor.getString(pCursor.getColumnIndex(
                                    ContactsContract.CommonDataKinds.Phone.NUMBER));
                            }
                            if (callBack) {
                                callBack(givenName, phoneNumber);
                            }
                            cursor.close();
                            pCursor.close();
                        }
                    };
                    main.startActivityForResult(intent, REQUESTCODE);
                })
            }
        }
    }
}
module.exports = {
    nativeCommon: nativeCommon
}

使用方法引入上方的JS 模块

import { nativeCommon } from '@/utils/nativeCommon.js'

appReadContact() {
            let that = this
            nativeCommon.contacts.getContact(function (name, phoneNumber) {
                console.log('name', name, phoneNumber)
                // phoneNumber,name 分别为选中的手机号,联系人备注
            })

},

相关文章

网友评论

      本文标题:uniapp 调用原生手机联系人以获取手机联系人

      本文链接:https://www.haomeiwen.com/subject/qyasortx.html