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

104 lines
2.9 KiB
Markdown

# 蓝牙电话模块权限适配文档
## 一、权限 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);
}
```