104 lines
2.9 KiB
Markdown
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);
|
|
}
|
|
```
|
|
|