Files
Obsidian/项目文档/徐工/蓝牙模块权限适配文档.md
T
2026-11-05 14:35:04 +08:00

2.9 KiB

蓝牙电话模块权限适配文档

一、权限 Key

Key 关联功能
xcmg_permission_contacts_bluetooth_phone 联系人同步、通话记录
xcmg_permission_microphone_bluetooth_phone 去电/接听时麦克风采集

值:0 = 未授权,1 = 已授权

读取方式:

boolean authorized = Settings.System.getInt(
    context.getContentResolver(), "xcmg_permission_xxx", 0) == 1;

二、权限关联逻辑

2.1 拨号键(去电前校验麦克风权限)

点击拨号键
    │
    ├── 麦克风权限 == 1 → 正常去电
    │
    └── 麦克风权限 == 0 → 弹出多权限勾选弹窗
          ├── 勾选 + 确定授权 → 权限写入 → 正常去电
          └── 取消 → 不去电
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 → 弹出多权限勾选弹窗
          ├── 勾选 + 确定授权 → 权限写入 → 执行同步
          └── 取消 → 不执行同步
public void onSyncClick() {
    if (!isContactsAuthorized()) {
        showPermissionDialog();  // 同上广播
        return;
    }
    doSyncContacts();
}

2.3 联系人权限控制的数据同步

联系人权限 == 0 时,不同步/存储联系人和通话记录到车机端。权限状态直接读 Settings.System 实时判断,无需回调。


三、弹窗触发方式

发送广播即可,CarControl 模块自动弹出对应权限的勾选框弹窗:

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 监听:

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);
}