2016-05-23 5 views
0

Я пытаюсь использовать новую камеру Android2 api. Я начал с источника из этого урока: http://jylee-world.blogspot.com/2014/12/a-tutorial-of-androidhardwarecamera2.html. Когда я пытаюсь usb-debug-развертывать его на любой телефон, я получаю SecurityException от CameraManager.openCamera(...).Android Camera2 API SecurityException

Мой AndroidManifest выглядит следующим образом:

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

Это, кажется, что каждый учебник я смог найти делает. Я могу получить разрешение на другие действия; например, я могу заставить камеру вибрировать просто отлично. Я также могу перечислить камеры с CameraManager.getCameraIdLists() просто отлично, но я не уверен, действительно ли это требует разрешения. Но я не могу openCamera.

Есть ли дополнительные разрешения, которые мне нужны? Я делаю что-то неправильно?

Спасибо за помощь!

Это моя полные трассировки стеки:

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 да, я запускаю его на 6.1 – B1CL0PS

+0

Вы просили разрешения? Если API-интерфейс вашего целевого приложения 23, вам необходимо запросить разрешение. Или, по крайней мере, для этого теста вам нужно перейти к настройке и предоставить разрешение, если вы не хотите сейчас добавлять дополнительные материалы. Но вы должны будете позже – Alex

ответ

3

В Android M, время выполнения проверки требуется разрешение опасного разрешения. Вы можете увидеть опасное разрешение 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

Разрешение, которое вы пытаетесь дать, считается опасным разрешением android. https://developer.android.com/guide/topics/security/permissions.html#normal-dangerous

Различные другие отзывы о разрешении выполнения, я предлагаю вам использовать этот https://github.com/Karumi/Dexter

Это Lib делает обработку легко

1

Просто закройте устройство камеры в onSurfaceTextureDestroyed функции разрешения

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

Исключение безопасности будет исправлено

+0

Можете ли вы объяснить это лучше? Почему закрытие камеры с помощью функции 'cameraDevice.close()' не приведет к исключению безопасности? – CPHPython

0

Много раз боролся с этим, размышляя несколько раз, я решил проблему. В конце концов, ни один из «исправлений», которые я прочитал, здесь не работал. Затем, после ввода ~ 100 операторов Log.v в моей Java, я понял, что это проблема с потоками, которая может или не может начинаться с этой ошибки в зависимости от событий на камере.В принципе, я думаю, главная программа работает в основном потоке, но там была дополнительный поток стартовал следующее утверждение:

//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 
       } 
      }); 
Смежные вопросы