2017-05-04 79 views
0

我试图打开相机,但错误关闭了应用程序。昨天的代码工作,由于某种原因,现在没有物理的手机上运行CameraManager.openCamera缺少所需权限:android.permission.CAMERA

私人无效connectCamera(){

CameraManager cameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE); 
    try { 
     if (!mCameraOpenCloseLock.tryAcquire(2500, TimeUnit.MILLISECONDS)) { 
      throw new RuntimeException("Time out waiting to lock camera opening."); 
     } 

     int permissionCheck = ActivityCompat.checkSelfPermission(context, Manifest.permission.CAMERA); 

     if (permissionCheck != PackageManager.PERMISSION_GRANTED) { 

      ActivityCompat.requestPermissions((Activity)context, PERMISSIONS, PERMISSION_ALL); 
      //java.lang.SecurityException: Lacking privileges to access camera service 
     } 

     cameraManager.openCamera("0", mCameraDeviceStateCallback,null); 

    } catch (CameraAccessException e) { 
     e.printStackTrace(); 
    } catch (InterruptedException e) { 
     throw new RuntimeException("Interrupted while trying to lock camera opening.", e); 
    } 
} 

java.lang.SecurityException: Lacking privileges to access camera service

回答

0

的问题是,ActivityCompat.requestPermissions(...)是非阻塞的,所以实际发生的事情是你的应用程序请求允许但在此之前,用户可以授予它(或者可以显示甚至对话框),该cameraManager.openCamera(...)线被执行,如果事先没有授予权限,显然会引发异常。这意味着你必须在这里分理处办理业务:

  • ,如果你有授予权限,执行cameraManager.openCamera(...)
  • 如果具有的权限授予调用ActivityCompat.requestPermissions(...)并等待在onRequestPermissionsResult(...)结果

当你有结果(和许可被允许了),你可以打开摄像头:

@Override 
public void onRequestPermissionsResult(int requestCode, 
     String permissions[], int[] results) { 
    switch (requestCode) { 
     case PERMISSION_ALL: 
      if (results.length > 0 && results[0] == PackageManager.PERMISSION_GRANTED) { 
       // permission granted 
       cameraManager.openCamera("0", mCameraDeviceStateCallback,null); 
      } else { 
       // permission denied 
      } 

      return; 
    } 
} 

也不要忘了把这个权限在你的清单文件太多,如果你minSdkVersion小于23

更多细节退房Requesting Permissions at Run Time