uni-app使用native.js拉取手机通讯录页面选择手机号,仿支付宝微信手机充值选择通讯录好友

新建 utils 目录下 nativeCommon.js

/**
 * 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":
					nativeCommon.contacts.android.visitContacts(function(name, phoneNumber) {
						callBack(name, phoneNumber);
					});
					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
}

// #endif

在组件中点击事件调取该方法

//首先引入该js
import {nativeCommon} from '@/utils/nativeCommon.js'

// 获取通讯录
getContacts() {
	// 获取通讯录对象
	nativeCommon.contacts.getContact(function(name,phoneNumber){
		that.mobile = phoneNumber;
	})
}

uni-app使用native.js拉取手机通讯录页面选择手机号,仿支付宝微信手机充值选择通讯录好友_第1张图片

 

你可能感兴趣的:(uni-app)