在开发的过程中,我们总会不可避免的为了运营推广而去利用当前用户的通讯录好友列表,
例如:
1.淘宝的查看当前用户的通讯录里的哪些好友已经开通了淘宝
2.添加收获地址的时候,添加收货人的电话号码等等
....
这个时候 就不可避免的需要访问用户的通讯录数据,或者打开用户的通讯录页面
那么这个时候,我们一般都需要分为几步走:
a.申请获取设备的访问权限,当然这个也分为安卓和苹果;
安卓:
plus.android.requestPermissions(
[''android.permission.READ_CONTACTS''],
function(resultObj) {
resolve(resultObj);
},
function(error) {
console.log('result error: ' + error.message)
resolve({
code: error.code,
message: error.message
});
}
);
IOS:
function contact() {
var result = 0;
var CNContactStore = plus.ios.import("CNContactStore");
var cnAuthStatus = CNContactStore.authorizationStatusForEntityType(0);
if (cnAuthStatus === 0) {
result = null;
} else if (cnAuthStatus == 3) {
result = 1;
} else {
result = 0;
}
plus.ios.deleteObject(CNContactStore);
console.log('contact:'+result)
return result;
}
当然这一步,可以根据您的业务逻辑放在任何你想放的地方,但是,重点来了
如果,用户拒绝授权,那又该怎么办呢?
这就进入了下一步
b.增加一个权限检测
同样可以利用上面的代码 ,就能获得哪些权限 已经被授权,哪些未被用户授权
对于未被授权的,直接提示用户是否打开设置页面去授权
PS:打开设置页面
function gotoAppPermissionSetting() {
if (uni.getSystemInfoSync().platform == 'ios') {
var UIApplication = plus.ios.import("UIApplication");
var application2 = UIApplication.sharedApplication();
var NSURL2 = plus.ios.import("NSURL");
var setting2 = NSURL2.URLWithString("app-settings:");
application2.openURL(setting2);
plus.ios.deleteObject(setting2);
plus.ios.deleteObject(NSURL2);
plus.ios.deleteObject(application2);
} else {
var Intent = plus.android.importClass("android.content.Intent");
var Settings = plus.android.importClass("android.provider.Settings");
var Uri = plus.android.importClass("android.net.Uri");
var mainActivity = plus.android.runtimeMainActivity();
var intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
var uri = Uri.fromParts("package", mainActivity.getPackageName(), null);
intent.setData(uri);
mainActivity.startActivity(intent);
}
}
c.接下来就是如何访问用户的数据了,分为两种方式:
I.读取数据,自定义渲染一个页面(个人认为,尽量不要保存用户的数据,这种有侵权之嫌啊)
plus.contacts.getAddressBook( plus.contacts.ADDRESSBOOK_PHONE, function( addressbook ) {
// 查找联系人
addressbook.find([],function(contacts){
console.log(JSON.stringify(contacts))
}, function () {
uni.showToast({
title: '获取联系人失败',
duration: 2000
})
// getContact();
},{multiple:true});
}, function ( e ) {
uni.showToast({
icon:"none",
title:"请授权您的通讯录权限"
})
});
拿到数据之后,多分析分析数据格式,再做处理(可能会以为不同的机型,数据的格式存在差异,避免隐藏的bug)
II.直接打开原生的界面
var nativeCommon = {
contacts:{
getContact:function(callBack){
switch (plus.os.name){
case "iOS":
nativeCommon.contacts.ios.visitAddressBook(function(name, phoneNumber){
callBack(name, phoneNumber);
});
break;
case "Android":
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:{
visitContacts: function(callBack){
var contactPickerVC = plus.ios.newObject("CNContactPickerViewController");
var delegate = plus.ios.implements("CNContactPickerDelegate", {
"contactPicker:didSelectContact:":function(picker, contact){
console.log(JSON.stringify(picker));
console.log(JSON.stringify(contact));
//姓名/公司
var name = "";
//姓氏
var familyName = contact.plusGetAttribute("familyName");
//名字
var givenName = contact.plusGetAttribute("givenName");
//公司
var organizationName = contact.plusGetAttribute("organizationName");
name = familyName+givenName;
if (name.length <= 0) {
name = organizationName;
}
//电话号码
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);
}
}
});
plus.ios.invoke(contactPickerVC, "setDelegate:", delegate);
var rootVc = nativeCommon.contacts.ios.getRootViewController();
plus.ios.invoke(rootVc, "presentViewController:animated:completion:", contactPickerVC, true, null);
},
visitAddressBook:function(callBack){
var peoplePickerNavController = plus.ios.newObject("ABPeoplePickerNavigationController");
(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person;】
peoplePickerDelegate
var peoplePickerDelegate = plus.ios.implements("ABPeoplePickerNavigationControllerDelegate", {
"peoplePickerNavigationController:didSelectPerson:":function(peoplePicker, person){
var contact = peoplePicker;
//姓名/公司
var name = "";
//姓氏
var familyName = contact.plusGetAttribute("familyName");
//名字
var givenName = contact.plusGetAttribute("givenName");
//公司
var organizationName = contact.plusGetAttribute("organizationName");
name = familyName+givenName;
if (name.length <= 0) {
name = organizationName;
}
//电话号码
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);
}
}
});
plus.ios.invoke(peoplePickerNavController, "setPeoplePickerDelegate:", peoplePickerDelegate);
var rootVc = nativeCommon.contacts.ios.getRootViewController();
plus.ios.invoke(rootVc, "presentViewController:animated:completion:", peoplePickerNavController, true, null);
},
getRootViewController: function(){
var UIApplication = plus.ios.invoke("UIApplication", "class");
var sharedApplication = plus.ios.invoke(UIApplication, "sharedApplication");
var appDelegate = plus.ios.invoke(sharedApplication, "delegate");
var appWindow = plus.ios.invoke(appDelegate, "window");
return plus.ios.invoke(appWindow, "rootViewController");
},
getViewControllerByView: function(view){
var UIViewController = plus.ios.invoke("UIViewController", "class");
while(view){
var responder = plus.ios.invoke(view, "nextResponder");
if (plus.ios.invoke(responder, "isKindOfClass:", UIViewController)) {
return responder;
}
view = plus.ios.invoke(view, "superview");
}
return null;
}
},
android:{
visitContacts:function(callBack){
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));
}
console.log(givenName)
console.log(phoneNumber)
if (callBack) {
callBack(givenName, phoneNumber);
}
cursor.close();
pCursor.close();
}
};
main.startActivityForResult(intent, REQUESTCODE);
}
}
}
}
export default nativeCommon
这个文件 可以直接拿来放在你们的项目里使用 也可以根据你们自己的需要更改。
划重点:一定要云编译打包,最好真机测试!!!
来源:oschina
链接:https://my.oschina.net/1861/blog/4483964