178 lines
4.7 KiB
Markdown
178 lines
4.7 KiB
Markdown
|
|
# 蓝牙权限配置完整指南
|
|||
|
|
|
|||
|
|
## 📋 权限配置概述
|
|||
|
|
|
|||
|
|
本应用已配置完整的蓝牙权限支持,包括:
|
|||
|
|
- **Android 11及以下**:需要位置权限进行蓝牙扫描
|
|||
|
|
- **Android 12+**:使用新的蓝牙权限模型,无需位置权限
|
|||
|
|
|
|||
|
|
## 🔧 AndroidManifest.xml 配置
|
|||
|
|
|
|||
|
|
### 基础蓝牙权限
|
|||
|
|
```xml
|
|||
|
|
<!-- 基础蓝牙权限 (Android 11及以下) -->
|
|||
|
|
<uses-permission android:name="android.permission.BLUETOOTH" />
|
|||
|
|
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
|
|||
|
|
|
|||
|
|
<!-- Android 12+ 新蓝牙权限 -->
|
|||
|
|
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
|
|||
|
|
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 位置权限(仅Android 11及以下需要)
|
|||
|
|
```xml
|
|||
|
|
<!-- 位置权限 (Android 11及以下需要) -->
|
|||
|
|
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
|
|||
|
|
android:maxSdkVersion="30" />
|
|||
|
|
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"
|
|||
|
|
android:maxSdkVersion="30" />
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Android 12+ 特殊配置
|
|||
|
|
```xml
|
|||
|
|
<!-- Android 12+ 蓝牙扫描权限 (不用于定位) -->
|
|||
|
|
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"
|
|||
|
|
android:usesPermissionFlags="neverForLocation" />
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 📱 运行时权限请求
|
|||
|
|
|
|||
|
|
### 动态权限检查
|
|||
|
|
应用会根据Android版本自动确定所需权限:
|
|||
|
|
|
|||
|
|
```kotlin
|
|||
|
|
// Android 12+ 使用新的蓝牙权限
|
|||
|
|
private val REQUIRED_PERMISSIONS: Array<String> = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
|||
|
|
arrayOf(
|
|||
|
|
Manifest.permission.BLUETOOTH_SCAN,
|
|||
|
|
Manifest.permission.BLUETOOTH_CONNECT
|
|||
|
|
)
|
|||
|
|
} else {
|
|||
|
|
// Android 11及以下需要位置权限
|
|||
|
|
arrayOf(
|
|||
|
|
Manifest.permission.BLUETOOTH_SCAN,
|
|||
|
|
Manifest.permission.BLUETOOTH_CONNECT,
|
|||
|
|
Manifest.permission.ACCESS_FINE_LOCATION,
|
|||
|
|
Manifest.permission.ACCESS_COARSE_LOCATION
|
|||
|
|
)
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 权限状态显示
|
|||
|
|
应用会显示详细的权限状态:
|
|||
|
|
- ✅ 已授予权限
|
|||
|
|
- ❌ 缺少权限
|
|||
|
|
- 💡 权限请求提示
|
|||
|
|
|
|||
|
|
## 🔍 权限检查流程
|
|||
|
|
|
|||
|
|
### 1. 应用启动时检查
|
|||
|
|
- 显示当前权限状态
|
|||
|
|
- 提示用户授予必要权限
|
|||
|
|
|
|||
|
|
### 2. 蓝牙操作前检查
|
|||
|
|
- 自动检查所需权限
|
|||
|
|
- 如果缺少权限,自动请求
|
|||
|
|
- 显示权限请求结果
|
|||
|
|
|
|||
|
|
### 3. 权限结果处理
|
|||
|
|
- 显示已授予和被拒绝的权限
|
|||
|
|
- 提供手动设置指导
|
|||
|
|
- 根据权限状态决定是否继续操作
|
|||
|
|
|
|||
|
|
## 🚨 常见权限问题
|
|||
|
|
|
|||
|
|
### 1. 权限被拒绝
|
|||
|
|
**症状**: 扫描无结果,显示"权限被拒绝"
|
|||
|
|
**解决方案**:
|
|||
|
|
1. 进入应用设置 → 权限
|
|||
|
|
2. 手动开启蓝牙和位置权限
|
|||
|
|
3. 重启应用
|
|||
|
|
|
|||
|
|
### 2. Android 12+ 权限问题
|
|||
|
|
**症状**: 新设备上扫描失败
|
|||
|
|
**解决方案**:
|
|||
|
|
1. 确保使用新的蓝牙权限
|
|||
|
|
2. 检查`neverForLocation`标志
|
|||
|
|
3. 确认权限已正确授予
|
|||
|
|
|
|||
|
|
### 3. 位置权限问题
|
|||
|
|
**症状**: Android 11及以下设备扫描失败
|
|||
|
|
**解决方案**:
|
|||
|
|
1. 确保位置权限已授予
|
|||
|
|
2. 检查GPS是否开启(某些厂商系统需要)
|
|||
|
|
3. 重启蓝牙服务
|
|||
|
|
|
|||
|
|
## 📊 权限状态检查
|
|||
|
|
|
|||
|
|
### 应用内权限状态显示
|
|||
|
|
```
|
|||
|
|
权限状态:
|
|||
|
|
BLUETOOTH_SCAN: ✓
|
|||
|
|
BLUETOOTH_CONNECT: ✓
|
|||
|
|
ACCESS_FINE_LOCATION: ✓
|
|||
|
|
ACCESS_COARSE_LOCATION: ✓
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 系统设置检查
|
|||
|
|
1. **设置 → 应用 → 本应用 → 权限**
|
|||
|
|
2. **设置 → 隐私 → 位置信息**
|
|||
|
|
3. **设置 → 蓝牙**
|
|||
|
|
|
|||
|
|
## 🛠️ 调试权限问题
|
|||
|
|
|
|||
|
|
### 1. 检查权限声明
|
|||
|
|
```bash
|
|||
|
|
# 确认AndroidManifest.xml中的权限声明正确
|
|||
|
|
# 检查maxSdkVersion和usesPermissionFlags
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 检查运行时权限
|
|||
|
|
```kotlin
|
|||
|
|
// 在代码中检查权限状态
|
|||
|
|
ContextCompat.checkSelfPermission(context, permission)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. 查看权限请求结果
|
|||
|
|
```kotlin
|
|||
|
|
// 在onRequestPermissionsResult中处理结果
|
|||
|
|
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 📝 权限配置清单
|
|||
|
|
|
|||
|
|
### AndroidManifest.xml 检查项
|
|||
|
|
- [ ] 基础蓝牙权限已声明
|
|||
|
|
- [ ] Android 12+ 新权限已声明
|
|||
|
|
- [ ] 位置权限限制到Android 11及以下
|
|||
|
|
- [ ] `neverForLocation`标志已设置
|
|||
|
|
- [ ] 蓝牙功能特性已声明
|
|||
|
|
|
|||
|
|
### 代码权限检查项
|
|||
|
|
- [ ] 动态权限检查已实现
|
|||
|
|
- [ ] 权限请求已处理
|
|||
|
|
- [ ] 权限结果已处理
|
|||
|
|
- [ ] 权限状态显示已实现
|
|||
|
|
|
|||
|
|
### 测试检查项
|
|||
|
|
- [ ] Android 11及以下设备测试通过
|
|||
|
|
- [ ] Android 12+ 设备测试通过
|
|||
|
|
- [ ] 权限拒绝场景测试通过
|
|||
|
|
- [ ] 权限授予后功能正常
|
|||
|
|
|
|||
|
|
## 🎯 针对目标设备的权限检查
|
|||
|
|
|
|||
|
|
### 目标设备: `A4:C3:37:86:9F:73`
|
|||
|
|
|
|||
|
|
1. **确认设备Android版本**
|
|||
|
|
2. **检查对应权限是否已授予**
|
|||
|
|
3. **验证权限配置是否正确**
|
|||
|
|
4. **测试扫描功能是否正常**
|
|||
|
|
|
|||
|
|
## 🚀 下一步操作
|
|||
|
|
|
|||
|
|
1. **重新编译应用**
|
|||
|
|
2. **在目标设备上测试权限**
|
|||
|
|
3. **确认权限授予后扫描正常**
|
|||
|
|
4. **如果仍有问题,检查设备特定设置**
|