# 蓝牙电话模块权限适配文档 ## 一、权限 Key | Key | 关联功能 | | -------------------------------------------- | ----------- | | `xcmg_permission_contacts_bluetooth_phone` | 联系人同步、通话记录 | | `xcmg_permission_microphone_bluetooth_phone` | 去电/接听时麦克风采集 | 值:`0` = 未授权,`1` = 已授权 读取方式: ```java boolean authorized = Settings.System.getInt( context.getContentResolver(), "xcmg_permission_xxx", 0) == 1; ``` --- ## 二、权限关联逻辑 ### 2.1 拨号键(去电前校验麦克风权限) ``` 点击拨号键 │ ├── 麦克风权限 == 1 → 正常去电 │ └── 麦克风权限 == 0 → 弹出多权限勾选弹窗 ├── 勾选 + 确定授权 → 权限写入 → 正常去电 └── 取消 → 不去电 ``` ```java public void onDialClick(String phoneNumber) { if (!isMicAuthorized()) { showPermissionDialog(); // 发广播 ACTION_SHOW_MULTI_PERMISSION_DIALOG, package_name="com.yaxon.bluetooth" return; } doDial(phoneNumber); } ``` ### 2.2 一键同步 / 刷新(同步前校验联系人权限) ``` 点击"一键同步" / "刷新" │ ├── 联系人权限 == 1 → 开始同步 │ └── 联系人权限 == 0 → 弹出多权限勾选弹窗 ├── 勾选 + 确定授权 → 权限写入 → 执行同步 └── 取消 → 不执行同步 ``` ```java public void onSyncClick() { if (!isContactsAuthorized()) { showPermissionDialog(); // 同上广播 return; } doSyncContacts(); } ``` ### 2.3 联系人权限控制的数据同步 联系人权限 == 0 时,不同步/存储联系人和通话记录到车机端。权限状态直接读 `Settings.System` 实时判断,无需回调。 --- ## 三、弹窗触发方式 发送广播即可,CarControl 模块自动弹出对应权限的勾选框弹窗: ```java Intent intent = new Intent("com.yaxon.carcontrol.ACTION_SHOW_MULTI_PERMISSION_DIALOG"); intent.putExtra("package_name", "com.yaxon.bluetooth"); intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); context.sendBroadcast(intent); ``` ## 四、监听授权结果 如果需要授权后自动继续操作(如授权后自动拨号/同步),用 ContentObserver 监听: ```java private void registerPermissionObserver() { mObserver = new ContentObserver(new Handler(Looper.getMainLooper())) { @Override public void onChange(boolean selfChange) { if (isMicAuthorized()) { doDial(mPendingPhoneNumber); // 授权后自动去电 unregisterObserver(); } } }; context.getContentResolver().registerContentObserver( Settings.System.getUriFor("xcmg_permission_microphone_bluetooth_phone"), false, mObserver); } ```