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

  • 相关阅读:
    五种常见的 PHP 设计模式(收藏)
    写年度工作总结
    关于window.open和window.showdialog返回值的问题
    50个令人叹为观止的JavaScript应用站点[转]
    10大免费FLV播放器下载[转]
    6个去掉图片上的文字的技巧实用简单
    mysql命令大全(转)
    10款替代Windows Media Player的播放器
    Editplus FTP远程访问Ubuntu
    C++ 元编程 Meta Programming
  • 原文地址:https://www.cnblogs.com/raym/p/13431546.html
Copyright © 2020-2023  润新知