记一次Android调用外部摄像头失败的问题
问题代码
if (mUsbManager.hasPermission(device)) { process(device); } else { try { // パーミッションがなければ要求する mUsbManager.requestPermission(device, mPermissionIntent); } catch (final Exception e) { // Android5.1.xのGALAXY系でandroid.permission.sec.MDM_APP_MGMTという意味不明の例外生成するみたい processCancel(device); } }
现象描述
这里本应该在判断没有权限时会动态的申请USB权限,并弹窗请求确认。
实际运行时,会判断没有权限,进入请求权限,不会弹窗请求确认,并且不会抛出异常,再次运行时仍然是没有权限。
有说日志会打印这段话,我这没看到,可能是日志太多没注意到。
UsbUserSettingsManager: Camera permission required for USB video class devices
原因
SDK版本的问题,SDK28之后需要先授权camera权限之后,才可以正常运行。
经测试手动授权camera之后就可以正常调用摄像头了。
解决办法
manifest里加入
<uses-permission android:name="android.permission.CAMERA"/>
Activity里加入动态申请相机、和存储权限代码。由于请求权限是异步的,所以需要在调用摄像头之前就申请完。
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
高版本的运行没问题,低版本的系统运行时每次都会弹出授权,需要加个判断。
if(ContextCompat.checkSelfPermission(this,Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED){ ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); }
但是这个判断在高版本里不兼容,所以要兼容的话还需要加一个版本判断(android.os.Build.VERSION.SDK_INT)
顺便推荐一下ADB WIFI 插件 手机只有一个usb口,插上设备就不能调试,买的分线器也不行,后来发现这款插件,可以插着设备调联机调试了
https://raybit.eu.org 谷歌一下