Android Studio USB 常见问题:如何解决 EXTRA_PERMISSION_GRANTED 始终返回 false
2024-03-22 23:43:58
Android Studio USB: 解决 EXTRA_PERMISSION_GRANTED 始终返回 false 的问题
前言
在 Android Studio 中使用 USB CDC 设备时,您可能会遇到 EXTRA_PERMISSION_GRANTED 始终返回 false 的问题,从而阻碍您的 USB 通信。本文将深入探讨此问题的潜在原因并提供详尽的解决方案,帮助您解决此问题并顺利进行 USB 开发。
问题根源
EXTRA_PERMISSION_GRANTED 返回 false 的原因可能有很多,包括:
- 用户拒绝权限: 用户可能拒绝了应用访问 USB 设备的请求。
- USB 调试未启用: Android 设备上的 USB 调试选项未启用。
- USB 权限未声明: 应用的 AndroidManifest.xml 文件中未正确声明 USB 权限。
- USB 驱动程序问题: 使用的 USB 设备可能需要特殊的驱动程序,而该驱动程序尚未安装。
解决方案
1. 启用 USB 调试
前往设备的“设置”>“开发者选项”并确保已启用“USB 调试”。这将允许您的设备与电脑通信。
2. 声明 USB 权限
在应用的 AndroidManifest.xml 文件中,添加以下权限声明:
<uses-permission android:name="android.permission.USB" />
这将向 Android 系统表明您的应用需要访问 USB 设备。
3. 安装正确的 USB 驱动程序
如果使用的是自定义 USB 设备,请确保已安装该设备的正确驱动程序。通常可以在制造商的网站上找到驱动程序。
4. 正确处理权限请求
使用 UsbManager.requestPermission()
方法请求 USB 权限,并在 onActivityResult()
方法中处理权限请求结果。使用 Intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)
获取结果。
5. 检查用户拒绝
如果用户拒绝了权限请求,EXTRA_PERMISSION_GRANTED 将始终返回 false。建议在拒绝请求后向用户提供反馈。
示例代码
以下代码演示了如何正确处理 USB 权限请求:
private val usbManager: UsbManager by lazy { getSystemService(Context.USB_SERVICE) as UsbManager }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val usbDevice = intent.getParcelableExtra<UsbDevice>(UsbManager.EXTRA_DEVICE)
if (usbManager.hasPermission(usbDevice)) {
// 权限已授予
} else {
val intent = Intent(ACTION_USB_PERMISSION)
intent.putExtra(UsbManager.EXTRA_DEVICE, usbDevice)
startActivityForResult(intent, USB_PERMISSION_REQUEST_CODE)
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == USB_PERMISSION_REQUEST_CODE) {
val granted = data?.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false) ?: false
if (granted) {
// 权限已授予
} else {
// 权限被拒绝
}
}
}
结论
通过遵循这些步骤,您可以解决 EXTRA_PERMISSION_GRANTED 返回 false 的问题并顺利进行 USB 开发。通过仔细处理权限请求、安装正确的驱动程序和确保 USB 调试已启用,您可以确保您的应用与 USB 设备建立可靠的通信。
常见问题解答
1. Android 6.0 及更高版本中 EXTRA_PERMISSION_GRANTED 为何总是返回 false?
这是 Android 平台的一个已知问题,目前尚未修复。
2. 我已经尝试了所有解决方案,但问题仍然存在。怎么办?
尝试重新启动设备或重新安装应用。如果问题仍然存在,请联系设备制造商或 Google 支持。
3. 如何检查 USB 调试是否已启用?
前往设备的“设置”>“开发者选项”并查看“USB 调试”选项是否已启用。
4. 我需要声明哪些 USB 权限?
只需要声明“android.permission.USB”权限即可。
5. 如何获取设备的 USB 符?
可以使用 usbManager.getDeviceDescriptor()
方法获取 USB 符。