nativeContact.js 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. /**
  2. * nativeContact,通过Native.js调用原生API
  3. * 选择通讯录电话
  4. */
  5. export const nativeContact = {
  6. /**
  7. * 通讯录模块
  8. */
  9. contacts: {
  10. getContact: (callBack) => {
  11. switch (plus.os.name) {
  12. case "iOS":
  13. if (plus.device.model === "iPhoneSimulator") {
  14. //模拟器
  15. nativeContact.contacts.ios.visitContacts((name, phoneNumber) => {
  16. callBack(name, phoneNumber);
  17. });
  18. } else {
  19. //真机
  20. nativeContact.contacts.ios.visitAddressBook((name, phoneNumber) => {
  21. callBack(name, phoneNumber);
  22. });
  23. }
  24. break;
  25. case "Android":
  26. // Android直接调用原生Intent选择联系人,无需READ_CONTACTS权限
  27. nativeContact.contacts.android.visitContacts((name, phoneNumber) => {
  28. callBack(name, phoneNumber);
  29. });
  30. break;
  31. default:
  32. break;
  33. }
  34. },
  35. ios: { //供iOS系统调用
  36. /**
  37. * 访问通讯录,将获取的联系人信息通过callBack返回
  38. * 仅限模拟器使用(Native.js 的bug)
  39. * @param {Object} callBack回调
  40. */
  41. visitContacts: (callBack) => {
  42. const contactPickerVC = plus.ios.newObject("CNContactPickerViewController");
  43. //实现代理方法【- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact;】
  44. //同时生成遵守CNContactPickerDelegate协议的代理对象delegate
  45. const delegate = plus.ios.implements("CNContactPickerDelegate", {
  46. "contactPicker:didSelectContact:": (picker, contact) => {
  47. //姓名
  48. let name = "";
  49. //姓氏
  50. let familyName = contact.plusGetAttribute("familyName");
  51. //名字
  52. let givenName = contact.plusGetAttribute("givenName");
  53. name = familyName + givenName;
  54. //电话号码
  55. let phoneNo = "";
  56. let phoneNumbers = contact.plusGetAttribute("phoneNumbers");
  57. if (phoneNumbers.plusGetAttribute("count") > 0) {
  58. let phone = phoneNumbers.plusGetAttribute("firstObject");
  59. let phoneNumber = phone.plusGetAttribute("value");
  60. phoneNo = phoneNumber.plusGetAttribute("stringValue");
  61. }
  62. if (callBack) {
  63. callBack(name, phoneNo);
  64. }
  65. }
  66. });
  67. //给通讯录控制器contactPickerVC设置代理
  68. plus.ios.invoke(contactPickerVC, "setDelegate:", delegate);
  69. //获取当前UIWebView视图
  70. const currentWebview = plus.ios.currentWebview();
  71. //根据当前UIWebView视图获取当前控制器
  72. const currentVC = nativeContact.contacts.ios.getViewControllerByView(currentWebview);
  73. //由当前控制器present到通讯录控制器
  74. plus.ios.invoke(currentVC, "presentViewController:animated:completion:", contactPickerVC, true,
  75. null);
  76. },
  77. /**
  78. * 访问通讯录,将获取的联系人信息通过callBack返回
  79. * 仅限真机使用(Native.js 的bug)
  80. * @param {Object} callBack
  81. */
  82. visitAddressBook: (callBack) => {
  83. const peoplePickerNavController = plus.ios.newObject("ABPeoplePickerNavigationController");
  84. //实现代理方法【- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person;】
  85. //同时生成遵守ABPeoplePickerNavigationControllerDelegate协议的代理对象peoplePickerDelegate
  86. const peoplePickerDelegate = plus.ios.implements("ABPeoplePickerNavigationControllerDelegate", {
  87. "peoplePickerNavigationController:didSelectPerson:": (peoplePicker,
  88. person) => {
  89. //这里的peoplePicker竟然是CNContact实例对象,person是undefined
  90. console.log(JSON.stringify(peoplePicker));
  91. console.log(JSON.stringify(person));
  92. console.log(typeof person);
  93. //所以之前的代码不用改
  94. let contact = peoplePicker;
  95. //姓名
  96. let name = "";
  97. //姓氏
  98. let familyName = contact.plusGetAttribute("familyName");
  99. //名字
  100. let givenName = contact.plusGetAttribute("givenName");
  101. name = familyName + givenName;
  102. //电话号码
  103. let phoneNo = "";
  104. let phoneNumbers = contact.plusGetAttribute("phoneNumbers");
  105. if (phoneNumbers.plusGetAttribute("count") > 0) {
  106. let phone = phoneNumbers.plusGetAttribute("firstObject");
  107. let phoneNumber = phone.plusGetAttribute("value");
  108. phoneNo = phoneNumber.plusGetAttribute("stringValue");
  109. }
  110. if (callBack) {
  111. callBack(name, phoneNo);
  112. }
  113. }
  114. });
  115. //给通讯录控制器peoplePickerNavController设置代理
  116. plus.ios.invoke(peoplePickerNavController, "setPeoplePickerDelegate:", peoplePickerDelegate);
  117. //获取当前UIWebView视图
  118. const UIApplicationClass = plus.ios.importClass("UIApplication");
  119. const UIAppObj = UIApplicationClass.sharedApplication();
  120. const del = plus.ios.invoke(UIAppObj, "delegate");
  121. const appWindowObj = plus.ios.invoke(del, "window");
  122. const appRootController = plus.ios.invoke(appWindowObj, "rootViewController");
  123. //由当前控制器present到通讯录控制器
  124. plus.ios.invoke(appRootController, "presentViewController:animated:completion:",
  125. peoplePickerNavController, true,
  126. null);
  127. }
  128. },
  129. android: { //供android系统调用
  130. visitContacts: (callBack) => {
  131. const REQUESTCODE = 1000;
  132. const main = plus.android.runtimeMainActivity();
  133. const Intent = plus.android.importClass('android.content.Intent');
  134. const ContactsContract = plus.android.importClass('android.provider.ContactsContract');
  135. // 使用Phone.CONTENT_URI直接选择电话号码,无需READ_CONTACTS权限
  136. const intent = new Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Phone.CONTENT_URI);
  137. main.onActivityResult = (requestCode, resultCode, data) => {
  138. if (REQUESTCODE == requestCode && data) {
  139. let phoneNumber = "";
  140. let givenName = "";
  141. let context = main;
  142. plus.android.importClass(data);
  143. let contactData = data.getData();
  144. if (contactData) {
  145. let resolver = context.getContentResolver();
  146. plus.android.importClass(resolver);
  147. var cursor = resolver.query(contactData, null, null, null, null);
  148. plus.android.importClass(cursor);
  149. if (cursor.moveToFirst()) {
  150. // 直接从结果URI中获取姓名和电话
  151. givenName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)) || "";
  152. phoneNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)) || "";
  153. }
  154. cursor.close();
  155. if (callBack) {
  156. callBack(givenName, phoneNumber);
  157. }
  158. }
  159. }
  160. };
  161. main.startActivityForResult(intent, REQUESTCODE);
  162. }
  163. }
  164. }
  165. };