uniapp 調(diào)用原生手機聯(lián)系人以獲取手機聯(lián)系人

uniAPP 調(diào)用手機聯(lián)系人

  • 功能需求描述
    1 一般在設置收貨地址/添加聯(lián)系方式時,可以手動輸入,也可以直接獲取手機的聯(lián)系人
    2 方法一:通過HTML5 API中的plus.contacts.ADDRESSBOOK_PHONE獲取聯(lián)系人信息自定義列表
    3 方法二:通過Native.js調(diào)用原生API適配iosandroid
功能需求描述
一般在設置收貨地址/添加聯(lián)系方式時,可以手動輸入,也可以直接獲取手機的聯(lián)系人
方法一:通過HTML5 API中的plus.contacts.ADDRESSBOOK_PHONE獲取聯(lián)系人信息自定義列表
getContacts: function() {
                var that = this
                // 獲取通訊錄對象
                plus.contacts.getAddressBook( plus.contacts.ADDRESSBOOK_PHONE, function( addressbook ) {
                    uni.showToast({
                        title: '獲取通訊錄對象成功',
                        duration: 2000
                    })
                    console.log('獲取通訊錄對象成功')
                    console.log(addressbook)
                    // 查找聯(lián)系人
                    addressbook.find(["displayName","phoneNumbers"],function(contacts){
                        uni.showToast({
                            title: '獲取聯(lián)系人成功',
                            duration: 2000
                        })
                        console.log('獲取聯(lián)系人成功')
                        console.log(JSON.stringify(contacts))
                        that.list = contacts
                    }, function () {
                        uni.showToast({
                            title: '獲取聯(lián)系人失敗',
                            duration: 2000
                        })
                    },{multiple:true});
                }, function ( e ) {
                    uni.showToast({
                        title: '獲取通訊錄對象失敗:' + e.message,
                        duration: 2000
                    })
                });
}
方法二:通過Native.js調(diào)用原生API適配ios和android
/**
 * nativeCommon,通過Native.js調(diào)用原生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系統(tǒng)調(diào)用
            /**
             * 訪問通訊錄,將獲取的聯(lián)系人信息通過callBack返回
             * 僅限模擬器使用(Native.js 的bug)
             * @param {Object} callBack回調(diào)
             */
            visitContacts: function(callBack) {
                var contactPickerVC = plus.ios.newObject("CNContactPickerViewController");
                //實現(xiàn)代理方法【- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact;】
                //同時生成遵守CNContactPickerDelegate協(xié)議的代理對象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();
                //根據(jù)當前UIWebView視圖獲取當前控制器
                var currentVC = nativeCommon.contacts.ios.getViewControllerByView(currentWebview);
                //由當前控制器present到通訊錄控制器
                plus.ios.invoke(currentVC, "presentViewController:animated:completion:", contactPickerVC, true,
                    null);
            },
            /**
             * 訪問通訊錄,將獲取的聯(lián)系人信息通過callBack返回
             * 僅限真機使用(Native.js 的bug)
             * @param {Object} callBack
             */
            visitAddressBook: function(callBack) {
                var peoplePickerNavController = plus.ios.newObject("ABPeoplePickerNavigationController");
                //實現(xiàn)代理方法【- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person;】
                //同時生成遵守ABPeoplePickerNavigationControllerDelegate協(xié)議的代理對象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系統(tǒng)調(diào)用
            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 分別為選中的手機號,聯(lián)系人備注
            })

},
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容