камера setParameters не работает в Android 4.0.1 и 4.0.2 - PullRequest
2 голосов
/ 20 января 2012

Я занимаюсь разработкой приложения, которое прекрасно работает на всех версиях Android с сэндвичем до мороженого, а также на ICS 4.0.3.Однако для Galaxy Nexus с версиями 4.0.1 и 4.0.2 он принудительно закрывается, когда я вызываю Camera.setParameters ()

Мой фрагмент кода приведен ниже

// mCamera is my camera object.
// mFrameWidth and mFrameHeight are my desired preview size
Camera.Parameters params = mCamera.getParameters();
List<Camera.Size> sizes = params.getSupportedPreviewSizes();
width = mFrameWidth;
height = mFrameHeight;

// selecting optimal camera preview size closest to desired size
double minDiff = Double.MAX_VALUE;
for (Camera.Size size : sizes) {
     if (Math.abs(size.width - width) < minDiff) {
         mFrameWidth = size.width;
         mFrameHeight = size.height;
         minDiff = Math.abs(size.width - width);
     }
 }
 params.setPreviewSize(mFrameWidth, mFrameHeight);

 // Crashes here
 mCamera.setParameters(params);

Это сбойreport

java.lang.RuntimeException: setParameters failed
at android.hardware.Camera.native_setParameters(Native Method)
at android.hardware.Camera.setParameters(Camera.java:1295)
at com.example.MySurfaceView.surfaceChanged(MySurfaceView.java:182)
at android.view.SurfaceView.updateWindow(SurfaceView.java:544)
at android.view.SurfaceView.access$000(SurfaceView.java:81)
at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:169)
at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:590)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1617)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4424)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)

Казалось, что эта проблема была вызвана некоторой ошибкой в ​​версиях ICS 4.0.1 и 4.0.2, но я не смог найти никаких ошибок или проблем, связанных с этим.Было бы здорово, если бы кто-то мог указать мне правильное направление.Заранее спасибо !!

Ответы [ 2 ]

2 голосов
/ 20 января 2012

Да, добро пожаловать в фрагментацию Android. Работа с камерами - то, где фрагментация поднимает свою уродливую голову. Каждое устройство будет реагировать на различные параметры, и нет никаких гарантий относительно того, что это будет. Вы просто должны проверить. После того, как вы определите, какое устройство на что реагирует, вы выполняете проверки времени выполнения для определенных устройств или версий API, чтобы установить соответствующие параметры.

1 голос
/ 05 ноября 2012

В http://developer.android.com/reference/android/hardware/Camera.html вы увидите, что

"Этот класс [Camera] не является потокобезопасным и предназначен для использования из одного потока событий. ... ThisМетоды класса никогда не должны вызываться из нескольких потоков одновременно. "

Вы пытаетесь вызвать все эти методы в setPreviewCallbackWithBuffer () или setPreviewCallback ()?Оба они создадут новые потоки.

Еще одно примечание: Вы должны делать этот код только для изменения параметров, когда предварительный просмотр остановлен.

У меня сейчас такая же проблема;точный код работает в 2.2, но не 4.0 +.

...