uniapp 调用手机联系人
功能需求描述
一般在设置收货地址/添加联系方式时,可以手动输入,也可以直接获取手机的联系人
方法一:通过HTML5 API中的plus.contacts.ADDRESSBOOK_PHONE获取联系人信息自定义列表
plus.contacts.getAddressBook(plus.contacts.ADDRESSBOOK_PHONE,function(addressbook){
console.log('获取通讯录对象成功')
console.log(addressbook)
addressbook.find(["displayName","phoneNumbers"],function(contacts){
console.log("获取联系人成功")
console.log(JSON.stringify(contacts))
})
})
方法二:通过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模块
//首先引入该js
import { nativeCommon } from '@/common/utils/nativeCommon.js'
method中的事件
let that = this
nativeCommon.contacts.getContact(function(name, phoneNumber) {
console.log('name',name, phoneNumber)
that.phone = phoneNumber; // phoneNumber,name 分别为选中的手机号,联系人备注
})