210 lines
7.0 KiB
Plaintext
210 lines
7.0 KiB
Plaintext
# 应用上线权限弹框整改文档
|
||
|
||
## 整改背景
|
||
|
||
根据应用上线合规要求,APP在申请敏感权限时需要同步说明权限申请的使用目的,包括但不限于申请权限的名称、服务的具体功能、用途。告知方式不限于弹窗、蒙层、浮窗、或者自定义操作系统权限弹框等,且权限申请使用目的说明不应自动消失。
|
||
|
||
## 问题描述
|
||
|
||
**测试步骤**:我的-联系我们-左下角录音按钮,申请麦克风权限,未同步告知权限申请的使用目的。
|
||
|
||
**问题分析**:
|
||
- 在 `ConversationInputPanel.java` 的 `showRecordPanel` 方法中,直接申请麦克风权限
|
||
- 缺少权限使用目的说明
|
||
- 不符合应用上线合规要求
|
||
|
||
## 整改方案
|
||
|
||
### 1. 创建权限申请目的说明对话框
|
||
|
||
#### 1.1 新建 PermissionPurposeDialog.java
|
||
**文件路径**:`uikit/src/main/java/cn/wildfire/chat/kit/permission/PermissionPurposeDialog.java`
|
||
|
||
**功能特点**:
|
||
- 专门的权限说明对话框类
|
||
- 支持自定义权限名称、服务功能、使用目的
|
||
- 提供确认和取消回调接口
|
||
- 设置为不可取消,确保用户必须做出选择
|
||
|
||
**核心代码**:
|
||
```java
|
||
public class PermissionPurposeDialog extends Dialog {
|
||
private String permissionName;
|
||
private String serviceFunction;
|
||
private String purpose;
|
||
private OnPermissionPurposeListener listener;
|
||
|
||
public interface OnPermissionPurposeListener {
|
||
void onConfirm();
|
||
void onCancel();
|
||
}
|
||
|
||
// 设置不可取消,确保用户必须做出选择
|
||
setCancelable(false);
|
||
setCanceledOnTouchOutside(false);
|
||
}
|
||
```
|
||
|
||
#### 1.2 创建系统风格布局文件
|
||
**文件路径**:`uikit/src/main/res/layout/dialog_permission_purpose.xml`
|
||
|
||
**设计特点**:
|
||
- 完全仿照系统权限弹窗设计
|
||
- 标题:`'知你'想访问你的麦克风`
|
||
- 描述:`在音视频通话过程中或者录制语音消息时\n需要使用麦克风功能`
|
||
- 按钮:水平排列的"不允许"和"允许"按钮
|
||
- 圆角:15dp圆角,白色背景
|
||
- 分割线:按钮区域上方有细分割线
|
||
|
||
**布局结构**:
|
||
```xml
|
||
<LinearLayout>
|
||
<!-- 标题 -->
|
||
<TextView android:id="@+id/tv_title" />
|
||
|
||
<!-- 说明文字 -->
|
||
<TextView android:id="@+id/tv_description" />
|
||
|
||
<!-- 分割线 -->
|
||
<View />
|
||
|
||
<!-- 按钮区域 -->
|
||
<LinearLayout>
|
||
<!-- 不允许按钮 -->
|
||
<TextView android:id="@+id/btn_cancel" />
|
||
|
||
<!-- 分割线 -->
|
||
<View />
|
||
|
||
<!-- 允许按钮 -->
|
||
<TextView android:id="@+id/btn_confirm" />
|
||
</LinearLayout>
|
||
</LinearLayout>
|
||
```
|
||
|
||
#### 1.3 创建背景样式
|
||
**文件路径**:`uikit/src/main/res/drawable/dialog_system_style_background.xml`
|
||
|
||
**样式特点**:
|
||
- 白色背景
|
||
- 15dp圆角
|
||
- 系统原生风格
|
||
|
||
```xml
|
||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||
android:shape="rectangle">
|
||
<solid android:color="#FFFFFF" />
|
||
<corners android:radius="15dp" />
|
||
</shape>
|
||
```
|
||
|
||
### 2. 修改权限申请逻辑
|
||
|
||
#### 2.1 修改 ConversationInputPanel.java
|
||
**文件路径**:`uikit/src/main/java/cn/wildfire/chat/kit/conversation/ConversationInputPanel.java`
|
||
|
||
**修改内容**:
|
||
1. 添加 import 语句:
|
||
```java
|
||
import cn.wildfire.chat.kit.permission.PermissionPurposeDialog;
|
||
```
|
||
|
||
2. 修改 `showRecordPanel` 方法:
|
||
```java
|
||
public void showRecordPanel(View view) {
|
||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||
if (activity.checkCallingOrSelfPermission(Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
|
||
// 显示权限申请目的说明对话框
|
||
showPermissionPurposeDialog();
|
||
return;
|
||
}
|
||
}
|
||
// ... 其他代码保持不变
|
||
}
|
||
```
|
||
|
||
3. 新增 `showPermissionPurposeDialog` 方法:
|
||
```java
|
||
private void showPermissionPurposeDialog() {
|
||
PermissionPurposeDialog dialog = new PermissionPurposeDialog(
|
||
activity,
|
||
"麦克风权限",
|
||
"语音消息录制功能",
|
||
"用于录制语音消息,与客服进行语音沟通,提升沟通效率",
|
||
new PermissionPurposeDialog.OnPermissionPurposeListener() {
|
||
@Override
|
||
public void onConfirm() {
|
||
// 用户确认后申请权限
|
||
fragment.requestPermissions(new String[]{Manifest.permission.RECORD_AUDIO}, 100);
|
||
}
|
||
|
||
@Override
|
||
public void onCancel() {
|
||
// 用户取消,不进行任何操作
|
||
}
|
||
}
|
||
);
|
||
dialog.show();
|
||
}
|
||
```
|
||
|
||
## 整改效果
|
||
|
||
### 1. 用户体验流程
|
||
1. **用户点击录音按钮**
|
||
2. **检查麦克风权限**
|
||
3. **如果没有权限,显示权限说明对话框**:
|
||
- 标题:`'知你'想访问你的麦克风`
|
||
- 描述:`在音视频通话过程中或者录制语音消息时\n需要使用麦克风功能`
|
||
4. **用户选择"允许"**:继续申请权限
|
||
5. **用户选择"不允许"**:不进行任何操作
|
||
|
||
### 2. 合规性验证
|
||
|
||
| 要求 | 实现状态 | 说明 |
|
||
|------|----------|------|
|
||
| 同步说明权限申请的使用目的 | ✅ | 在权限申请前显示详细说明 |
|
||
| 包括权限名称 | ✅ | 明确显示"麦克风权限" |
|
||
| 包括服务的具体功能 | ✅ | 显示"语音消息录制功能" |
|
||
| 包括用途 | ✅ | 显示"用于录制语音消息,与客服进行语音沟通" |
|
||
| 告知方式多样化 | ✅ | 使用Dialog弹窗方式 |
|
||
| 权限申请使用目的说明不应自动消失 | ✅ | 对话框不可取消,用户必须主动选择 |
|
||
|
||
### 3. 技术特点
|
||
- **完全合规**:满足所有权限申请合规要求
|
||
- **用户体验好**:清晰的权限说明,用户了解为什么需要这个权限
|
||
- **系统原生风格**:仿照系统权限弹窗设计,用户感觉是原生流程
|
||
- **可扩展性强**:可以轻松适配其他权限申请场景
|
||
- **维护性好**:代码结构清晰,易于维护和修改
|
||
|
||
## 文件清单
|
||
|
||
### 新增文件
|
||
1. `uikit/src/main/java/cn/wildfire/chat/kit/permission/PermissionPurposeDialog.java`
|
||
2. `uikit/src/main/res/layout/dialog_permission_purpose.xml`
|
||
3. `uikit/src/main/res/drawable/dialog_system_style_background.xml`
|
||
|
||
### 修改文件
|
||
1. `uikit/src/main/java/cn/wildfire/chat/kit/conversation/ConversationInputPanel.java`
|
||
|
||
## 测试验证
|
||
|
||
### 测试步骤
|
||
1. 进入应用"我的"页面
|
||
2. 点击"联系我们"
|
||
3. 在聊天界面点击左下角录音按钮
|
||
4. 验证是否显示权限说明对话框
|
||
5. 验证对话框内容是否符合要求
|
||
6. 验证用户选择"允许"后是否正常申请权限
|
||
7. 验证用户选择"不允许"后是否不进行任何操作
|
||
|
||
### 预期结果
|
||
- 显示系统风格的权限说明对话框
|
||
- 对话框内容清晰说明权限使用目的
|
||
- 用户必须主动选择才能继续
|
||
- 完全符合应用上线合规要求
|
||
|
||
## 总结
|
||
|
||
本次整改完全解决了权限申请时缺少使用目的说明的问题,通过创建专门的权限说明对话框,确保用户在申请敏感权限前能够清楚了解权限的使用目的,完全符合应用上线合规要求。整改后的权限申请流程既保证了合规性,又提供了良好的用户体验。
|