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

  • 相关阅读:
    那天有个小孩跟我说LINQ(一) 转载
    关于cornerstone无法上传library文件的问题
    could not read data from '/Users/xxxx/myapp-Info.plist'
    symbol(s) not found for architecture x86_64
    MJ刷新控件MJRefreshFooterView上拉之后收不回来的解决办法
    [__NSCFNumber length]: unrecognized selector sent to instance 0x8b3c310
    An instance 0x172b8600 of class UITableView was deallocated while key value
    让UIScrollView、UITableView的滚动条一直显示
    访问iPhone通讯录的问题
    从模态视图push到另一个视图
  • 原文地址:https://www.cnblogs.com/raym/p/13431546.html
Copyright © 2011-2022 走看看