2016-05-23 26 views
0

私は新しいAndroid camera2 APIを使用しようとしています。私はこのチュートリアルのソースから始めました:http://jylee-world.blogspot.com/2014/12/a-tutorial-of-androidhardwarecamera2.html。私がusb-デバッグ - どの電話機にもデプロイしようとすると、CameraManager.openCamera(...)からSecurityExceptionが発生します。Android Camera2 API SecurityException

私AndroidManifestは、次のようになります。

<uses-feature android:name="com.android.hardware.camera2.full"/> 
<uses-permission android:name="android.permission.CAMERA"/> 

これは私がする見つけることができていたものすべてのチュートリアルのようです。他の行為の許可を得ることができます。たとえば、カメラをきれいに振動させることができます。私はCameraManager.getCameraIdLists()でカメラを列挙することもできますが、実際に許可が必要かどうかはわかりません。しかし、私はopenCameraできません。

必要な権限がいくつかありますか?私は何か間違っているのですか?

ありがとうございました! AndroidのMで

SecurityException 
java.lang.SecurityException: Lacking privileges to access camera serviceat android.hardware.camera2.utils.CameraBinderDecorator.throwOnError(CameraBinderDecorator.java:108) 
     at android.hardware.camera2.legacy.CameraDeviceUserShim.connectBinderShim(CameraDeviceUserShim.java:336) 
     at android.hardware.camera2.CameraManager.openCameraDeviceUserAsync(CameraManager.java:327) 
     at android.hardware.camera2.CameraManager.openCamera(CameraManager.java:457) 
     at com.example.quinnfreedman.camera2test.MainActivity$1.onSurfaceTextureAvailable(MainActivity.java:74) 
     at android.view.TextureView.getHardwareLayer(TextureView.java:368) 
     at android.view.View.updateDisplayListIfDirty(View.java:15167) 
     at android.view.View.draw(View.java:15964) 
     at android.view.ViewGroup.drawChild(ViewGroup.java:3612) 
     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3402) 
     at android.view.View.updateDisplayListIfDirty(View.java:15185) 
     at android.view.View.draw(View.java:15964) 
     at android.view.ViewGroup.drawChild(ViewGroup.java:3612) 
     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3402) 
     at android.view.View.updateDisplayListIfDirty(View.java:15185) 
     at android.view.View.draw(View.java:15964) 
     at android.view.ViewGroup.drawChild(ViewGroup.java:3612) 
     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3402) 
     at android.view.View.updateDisplayListIfDirty(View.java:15185) 
     at android.view.View.draw(View.java:15964) 
     at android.view.ViewGroup.drawChild(ViewGroup.java:3612) 
     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3402) 
     at android.view.View.draw(View.java:16197) 
     at com.android.internal.policy.PhoneWindow$DecorView.draw(PhoneWindow.java:2690) 
     at android.view.View.updateDisplayListIfDirty(View.java:15190) 
     at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:281) 
     at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:287) 
     at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:322) 
     at android.view.ViewRootImpl.draw(ViewRootImpl.java:2627) 
     at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2446) 
     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2079) 
     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1119) 
     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6060) 
     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) 
     at android.view.Choreographer.doCallbacks(Choreographer.java:670) 
     at android.view.Choreographer.doFrame(Choreographer.java:606) 
     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) 
     at android.os.Handler.handleCallback(Handler.java:746) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:148) 
     at android.app.ActivityThread.main(ActivityThread.java:5443) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
+0

Android 6でアプリを実行していますか? – Alex

+0

@Alexはい、私はそれを実行しています。 – B1CL0PS

+0

許可を求めましたか?アプリターゲットのAPI 23の場合は、許可を求める必要があります。または、少なくともこのテストでは、今すぐ余分なものを実装したくない場合には、設定して許可を与える必要があります。しかし、後で – Alex

答えて

3

、パーミッションのチェックが危険な許可を必要とする時間を実行します。

これは私の完全なスタックトレースです。あなたは危険な許可hereを見ることができます。許可を

チェック:アプリが権限を持っている

// Assume thisActivity is the current activity 
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity, 
     Manifest.permission.CAMERA); 

場合、メソッドはPackageManager.PERMISSION_GRANTEDを返し、アプリは操作を続行することができます。アプリケーションに許可がない場合、メソッドはPERMISSION_DENIEDを返し、アプリケーションは明示的にユーザーに許可を求める必要があります。詳細について

は:https://developer.android.com/training/permissions/requesting.html#perm-request

0

あなたはアンドロイド6+上でアプリケーションを実行している、あなたは有名なランタイム権限を与える必要があります。 https://developer.android.com/training/permissions/requesting.html

あなたが許可しようとしている許可は、危険なアクセス許可とみなされます。ランタイム許可に関する他の応答の異なる https://developer.android.com/guide/topics/security/permissions.html#normal-dangerous

は、私はあなたがこのlibにちょうどonSurfaceTextureDestroyed機能であなたのカメラデバイスを閉じ簡単

1

を扱う許可を行い、このhttps://github.com/Karumi/Dexter

使用することをお勧め

onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture){cameraDevice.close();cameraDevice = null;} 

セキュリティ例外が修正されます

+0

あなたはそれをより良く説明できますか? 'cameraDevice.close()'でカメラを閉じても、なぜセキュリティ例外はスローされませんか? – CPHPython

0

数週間考えてこれをオフにして苦労し、問題を解決しました。結局、私がここで読んだ「修正」のどれも働かなかった。その後、私のJavaで約100個のLog.vステートメントを入れた後、カメラ上のイベントに応じてこのエラーが発生するかどうかをスレッドの問題として認識しました。基本的に、私は、メインプログラムは、メインスレッド上で実行されていたと思うが、余分なスレッドがありましたが、次の文でキックオフ:

//this code seems to be the culprit ... commenting it out solve my problem 
private void showToast(final String text) { 
    final Activity activity = MyStupidProgram.this; 
    if (activity != null) { 
     activity.runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       Toast.makeText(activity, text, Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 
} 

をだから、何も恐らくはスレッドのカメラを呼び出して、この文ではありませんしながら、安全性、Android 5.xと6.xは私がshowToast( 'いくつかの駄目')を呼び出したときにセキュリティエラーを投げていました。

Toast.makeText( 'blah blah')を使用してコメントしています。私はセキュリティエラーを取り除くことができました。

さらに、これをページのonCreate()のコードに追加しました。メインスレッドの問題をキャッチするには:

Thread.setDefaultUncaughtExceptionHandler(
      new Thread.UncaughtExceptionHandler() { 
       @Override 
       public void uncaughtException(
         Thread paramThread, 
         Throwable paramThrowable 
       ) { 
        //Do your own error handling here 

        if (exceptionHandler != null) 
         exceptionHandler.uncaughtException(
           paramThread, 
           paramThrowable 
         ); //Delegates to Android's error handling 
        else 
         System.exit(2); //Prevents the service/app from freezing 
       } 
      }); 
関連する問題