uniapp 调用手机通讯录选中联系人及号码【APP】【微信小程序】
1、创建nativeContact.js文件
/** * nativeContact,通过Native.js调用原生API * 选择通讯录电话 */ export const nativeContact = { /** * 通讯录模块 */ contacts: { getContact: (callBack) => { switch (plus.os.name) { case "iOS": if (plus.device.model === "iPhoneSimulator") { //模拟器 nativeContact.contacts.ios.visitContacts((name, phoneNumber) => { callBack(name, phoneNumber); }); } else { //真机 nativeContact.contacts.ios.visitAddressBook((name, phoneNumber) => { callBack(name, phoneNumber); }); } break; case "Android": // Android通过plus.contacts.getAddressBook可弹出通讯录授权提示框 // nativeContact.contacts.android.visitContacts(function(name, phoneNumber) { // callBack(name, phoneNumber); // }); plus.contacts.getAddressBook(plus.contacts.ADDRESSBOOK_PHONE, (addressbook) => { nativeContact.contacts.android.visitContacts((name, phoneNumber) => { callBack(name, phoneNumber); }); }, (e) => { plus.nativeUI.alert("Get address book failed: " + e.message); }); break; default: break; } }, ios: { //供iOS系统调用 /** * 访问通讯录,将获取的联系人信息通过callBack返回 * 仅限模拟器使用(Native.js 的bug) * @param {Object} callBack回调 */ visitContacts: (callBack) => { const contactPickerVC = plus.ios.newObject("CNContactPickerViewController"); //实现代理方法【- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact;】 //同时生成遵守CNContactPickerDelegate协议的代理对象delegate const delegate = plus.ios.implements("CNContactPickerDelegate", { "contactPicker:didSelectContact:": (picker, contact) => { //姓名 let name = ""; //姓氏 let familyName = contact.plusGetAttribute("familyName"); //名字 let givenName = contact.plusGetAttribute("givenName"); name = familyName + givenName; //电话号码 let phoneNo = ""; let phoneNumbers = contact.plusGetAttribute("phoneNumbers"); if (phoneNumbers.plusGetAttribute("count") > 0) { let phone = phoneNumbers.plusGetAttribute("firstObject"); let phoneNumber = phone.plusGetAttribute("value"); phoneNo = phoneNumber.plusGetAttribute("stringValue"); } if (callBack) { callBack(name, phoneNo); } } }); //给通讯录控制器contactPickerVC设置代理 plus.ios.invoke(contactPickerVC, "setDelegate:", delegate); //获取当前UIWebView视图 const currentWebview = plus.ios.currentWebview(); //根据当前UIWebView视图获取当前控制器 const currentVC = nativeContact.contacts.ios.getViewControllerByView(currentWebview); //由当前控制器present到通讯录控制器 plus.ios.invoke(currentVC, "presentViewController:animated:completion:", contactPickerVC, true, null); }, /** * 访问通讯录,将获取的联系人信息通过callBack返回 * 仅限真机使用(Native.js 的bug) * @param {Object} callBack */ visitAddressBook: (callBack) => { const peoplePickerNavController = plus.ios.newObject("ABPeoplePickerNavigationController"); //实现代理方法【- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person;】 //同时生成遵守ABPeoplePickerNavigationControllerDelegate协议的代理对象peoplePickerDelegate const peoplePickerDelegate = plus.ios.implements("ABPeoplePickerNavigationControllerDelegate", { "peoplePickerNavigationController:didSelectPerson:": (peoplePicker, person) => { //这里的peoplePicker竟然是CNContact实例对象,person是undefined console.log(JSON.stringify(peoplePicker)); console.log(JSON.stringify(person)); console.log(typeof person); //所以之前的代码不用改 let contact = peoplePicker; //姓名 let name = ""; //姓氏 let familyName = contact.plusGetAttribute("familyName"); //名字 let givenName = contact.plusGetAttribute("givenName"); name = familyName + givenName; //电话号码 let phoneNo = ""; let phoneNumbers = contact.plusGetAttribute("phoneNumbers"); if (phoneNumbers.plusGetAttribute("count") > 0) { let phone = phoneNumbers.plusGetAttribute("firstObject"); let phoneNumber = phone.plusGetAttribute("value"); phoneNo = phoneNumber.plusGetAttribute("stringValue"); } if (callBack) { callBack(name, phoneNo); } } }); //给通讯录控制器peoplePickerNavController设置代理 plus.ios.invoke(peoplePickerNavController, "setPeoplePickerDelegate:", peoplePickerDelegate); //获取当前UIWebView视图 const UIApplicationClass = plus.ios.importClass("UIApplication"); const UIAppObj = UIApplicationClass.sharedApplication(); const del = plus.ios.invoke(UIAppObj, "delegate"); const appWindowObj = plus.ios.invoke(del, "window"); const appRootController = plus.ios.invoke(appWindowObj, "rootViewController"); //由当前控制器present到通讯录控制器 plus.ios.invoke(appRootController, "presentViewController:animated:completion:", peoplePickerNavController, true, null); } }, android: { //供android系统调用 visitContacts: (callBack) => { plus.contacts.getAddressBook(plus.contacts.ADDRESSBOOK_PHONE, (book) => { const REQUESTCODE = 1000; const main = plus.android.runtimeMainActivity(); const Intent = plus.android.importClass('android.content.Intent'); const ContactsContract = plus.android.importClass( 'android.provider.ContactsContract'); const intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); main.onActivityResult = (requestCode, resultCode, data) => { if (REQUESTCODE == requestCode) { let phoneNumber = ""; let resultString = ""; let context = main; plus.android.importClass(data); let contactData = data.getData(); let resolver = context.getContentResolver(); plus.android.importClass(resolver); var cursor = resolver.query(contactData, null, null, null, null); plus.android.importClass(cursor); cursor.moveToFirst(); //姓名 let givenName = cursor.getString(cursor.getColumnIndex(ContactsContract .Contacts.DISPLAY_NAME)) || ""; let contactId = cursor.getString(cursor.getColumnIndex(ContactsContract .Contacts._ID)); let 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); }); } } } };
2、引用并获取联系人及号码
//引用 // #ifdef APP-PLUS import { nativeContact } from '@/common/utils/nativeContact'; // #endif // #ifdef MP-WEIXIN wx.chooseContact({ success: res => { console.log(res); }, fail: error => { console.log(error); }, }); // #endif // #ifdef APP-PLUS nativeContact.contacts.getContact((name, phoneNumber) => { console.log('name', name, phoneNumber); }); // #endif
PS:后续测试后发现IOS系统上不能获取到通讯录
小程序部分可直接调用
wx.chooseContact({ success: res => { console.log(res); }, fail: error => { console.log(error); }, });
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理