2016-05-23 10 views
0

Ich versuche, das neue Android camera2 api zu verwenden. Ich begann mit der Quelle aus diesem Tutorial: http://jylee-world.blogspot.com/2014/12/a-tutorial-of-androidhardwarecamera2.html. Wenn ich versuche, es auf einem beliebigen Telefon zu debuggen, bekomme ich eine SecurityException von CameraManager.openCamera(...).Android Camera2 API SecurityException

Mein AndroidManifest sieht wie folgt aus:

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

Das, was jedes Tutorial zu sein scheint, ich habe in der Lage macht zu finden. Ich kann die Erlaubnis für andere Aktionen bekommen; Zum Beispiel kann ich die Kamera gut vibrieren lassen. Ich bin auch in der Lage, Kameras mit CameraManager.getCameraIdLists() aufzuzählen, aber ich bin mir nicht sicher, ob das tatsächlich Erlaubnis erfordert. Aber ich kann nicht openCamera.

Gibt es einige zusätzliche Berechtigungen, die ich brauche? Mache ich etwas falsch?

Danke für die Hilfe!

Das ist mein voller Stack-Trace:

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

Führen Sie die App auf Android 6? – Alex

+0

@Alex Ja, ich habe es auf 6.1 laufen – B1CL0PS

+0

Haben Sie um eine Erlaubnis gebeten? Wenn Sie die API 23 für Ihr App-Ziel benötigen, müssen Sie um Erlaubnis fragen. Oder zumindest für diesen Test müssen Sie zur Einstellung gehen und die Erlaubnis erteilen, wenn Sie gerade keine zusätzlichen Sachen implementieren wollen. Aber du musst später – Alex

Antwort

3

In Android M, Laufzeit Berechtigungsprüfung für gefährliche Genehmigung erforderlich ist. Sie können sehen, gefährliche Erlaubnis here.

prüfen Erlaubnis:

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

Wenn die App die Berechtigung hat, gibt die Methode PackageManager.PERMISSION_GRANTED, und die App kann mit dem Betrieb fortzufahren. Wenn die App nicht über die Berechtigung verfügt, gibt die Methode PERMISSION_DENIED zurück, und die App muss den Benutzer explizit um Erlaubnis bitten.

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

0

Wenn Sie Ihre Anwendung auf Android 6+ ausführen, müssen Sie die berühmten Laufzeitberechtigungen geben. https://developer.android.com/training/permissions/requesting.html

Die Berechtigung, die Sie geben möchten, gilt als eine gefährliche Berechtigungen android. https://developer.android.com/guide/topics/security/permissions.html#normal-dangerous

Verschiedene andere Antworten über Laufzeit Erlaubnis, empfehle ich Ihnen diese https://github.com/Karumi/Dexter

verwenden

Diese lib die Erlaubnis leicht

schließen Handhabung macht
1

Sie Ihre Kamera-Gerät in onSurfaceTextureDestroyed Funktion

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

Sicherheitsausnahme wird behoben

+0

Können Sie es besser erklären? Warum wird beim Schließen der Kamera mit 'cameraDevice.close()' die Sicherheitsausnahme nicht ausgelöst? – CPHPython

0

Ich war wochenlang damit beschäftigt und dachte mehrmals nach, dass ich das Problem gelöst hatte. Am Ende funktionierte nichts von den "Fixes", die ich hier gelesen hatte. Nachdem ich ~ 100 Log.v-Anweisungen in mein Java geschrieben hatte, erkannte ich, dass es sich um ein Threading-Problem handelte, das diesen Fehler abhängig von den Ereignissen auf der Kamera auslösen konnte oder auch nicht.Grundsätzlich glaube ich, lief das Hauptprogramm auf dem Haupt-Thread, aber es war ein extra Thread durch die folgende Anweisung gekickt:

//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(); 
      } 
     }); 
    } 
} 

So, während es gibt nichts in dieser Aussage die Kamera aufrufen, vielleicht wegen der Faden Sicherheit, Android 5.x und 6.x warfen Sicherheitsfehler, als ich showToast ('irgendein Mist') anrief;

Kommentieren und nur mit einem Toast.makeText ('blah blah'); Aussage, konnte ich den Sicherheitsfehler loswerden.

Zusätzlich habe ich dies dem Code auf der Seite onCreate() hinzugefügt; Anweisung, um irgendwelche Probleme auf dem Hauptthread zu fangen:

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 
       } 
      }); 
Verwandte Themen