現在很多APP,市場需求都需要讀取我們手機上的相關權限,例如WX要讀取通訊錄,相冊,照相機等權限,其他APP亦如此
但是在獲得這些權限之前我們首先需要徵得用戶的統一之後才能讀取
官方講解:
https://www.html5plus.org/doc/zh_cn/contacts.html
/*
* 權限設置
*/
var platform = uni.getSystemInfoSync().platform
onAddressBookSetting: function() {
if (this.isShow) {
return
}
this.isShow = true
uni.showModal({
title: '提示',
content: 'APP通訊錄權限沒有開啓,是否開啓?',
success(res) {
if (res.confirm) {
if (platform == 'ios') {
var UIApplication = plus.ios.import("UIApplication");
var NSURL2 = plus.ios.import("NSURL");
var setting2 = NSURL2.URLWithString("app-settings:");
var application2 = UIApplication.sharedApplication();
application2.openURL(setting2);
plus.ios.deleteObject(setting2);
plus.ios.deleteObject(NSURL2);
plus.ios.deleteObject(application2);
} else {
var main = plus.android.runtimeMainActivity();
var bulid = plus.android.importClass("android.os.Build");
var Intent = plus.android.importClass('android.content.Intent');
if (bulid.VERSION.SDK_INT >= 9) {
var intent = new Intent('android.settings.APPLICATION_DETAILS_SETTINGS');
var Uri = plus.android.importClass('android.net.Uri');
var uri = Uri.fromParts("package", main.getPackageName(), null)
intent.setData(uri);
intent.putExtra('android.content.Intent.setFlags', Intent.FLAG_ACTIVITY_NEW_TASK);
} else if (bulid.VERSION.SDK_INT <= 8) {
var intent = new Intent(Intent.ACTION_VIEW);
intent.setClassName("com.android.settings", "com.android.settings.InstalledAppDetails");
intent.putExtra("com.android.settings.ApplicationPkgName", main.getPackageName());
intent.putExtra('android.content.Intent.setFlags', Intent.FLAG_ACTIVITY_NEW_TASK);
}
main.startActivity(intent);
this.isShow = false
}
} else {
uni.navigateBack({
delta: 1
})
}
}
})
},
讀取手機通訊錄相關數據
注意:phoneNumbers 是一個數組,可以console一下,只取自己所需要的的數據,避免數據量過大導致讀取數據然後現在在手機上耗時緩慢;
對於數據量過大的操作,可以設置一個一個時間段內的緩存,這樣既保證了用戶訪問APP是可以快速顯示,有保證了通訊錄數據的較及時更新性
/*
* 初始化通訊錄
*/
initContacts: function() {
//獲取手機通訊錄
plus.contacts.getAddressBook(plus.contacts.ADDRESSBOOK_PHONE, (addressbook) => {
addressbook.find(["displayName", "phoneNumbers"], (contacts) => {
let temp = [];
contacts.forEach((item) => {
let FirstE = this._parseChar(item.displayName);
let unicode = FirstE.charCodeAt();
let index = parseInt(unicode - 65);
let text = item.displayName.slice(0, 1)
item.phoneNumbers.forEach(item_phone => {
item_phone.value = this.GetMobile(item_phone.value)
this.IsInvitedFun(item_phone.value);
let contact = {
'text': text,
'name': item.displayName,
'phone': item_phone.value,
}
temp = this.dataArr[index].Arr == undefined ? [] : this.dataArr[index].Arr;
let string=JSON.stringify(temp);
if (string.indexOf(item_phone.value) == -1) {
temp.push(contact);
}
this.dataArr[index].Arr = temp;
});
});
this.contactItems = JSON.parse(JSON.stringify(this.dataArr))
}
}, (e) => {
this.onAddressBookSetting()
});
}, (e) => {
this.onAddressBookSetting()
});
},
其他tip :每一個人的存儲電話的方式都不一樣手機型號不一樣,所以可能很多手機號碼都不規範,比如手機號碼中有很多空格,手機號碼之前有+86,如果你對手機號碼的格式要求不嚴,則不需要另外去處理,但是如果你對手機號碼的格式要求比較嚴格,只能有11位,中間沒有空格,座機號不顯示等等,則你需要對你獲取到的手機號進行另外的處理之後在存