记一次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口,插上设备就不能调试,买的分线器也不行,后来发现这款插件,可以插着设备调联机调试了

posted @ 2020-08-04 09:59  RAY_M  阅读(2225)  评论(0编辑  收藏  举报