2017-05-04 11 views
0

カメラを開こうとしていますが、エラーによりアプリケーションが終了しています。昨日のコードでは、今、それは物理的な携帯電話上では動作しませんCameraManager.openCameraに必要なパーミッションがありません:android.permission.CAMERA

ます。private voidは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

問題がcameraManager.openCamera(...)行が実行されます、ActivityCompat.requestPermissions(...)はノンブロッキングなので、どのような実際に起こることはアプリの許可を要求するが、ユーザがそれを許可することができ(あるいはダイアログが表示されることができる)の前ということです許可が事前に与えられていなければ、明らかに例外がスローされます。これは、あなたがここにあなたの操作を分岐する必要があることを意味します

  • あなたが付与された権限を持っている場合、あなたはないが付与された権限を持っているん場合、ActivityCompat.requestPermissions(...)を呼び出し、onRequestPermissionsResult(...)に結果を待つcameraManager.openCamera(...)
  • を実行します

あなたは結果(および権限が与えられた)を持っている場合は、あなたがカメラを開くことができます。

@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をチェックしている場合もあなたのマニフェストファイルにこの権限を置くことを忘れないでください。

関連する問題