набор параметров камеры не работает в android 4.0.1 и 4.0.2

Я разрабатываю приложение, которое отлично работает на всех версиях 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);

Это отчет о сбое

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, но я не смог найти никаких ошибок или проблем, связанных с этим. Было бы здорово, если бы кто-то мог указать мне правильное направление. Заранее спасибо!!


person Slartibartfast    schedule 20.01.2012    source источник


Ответы (2)


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

person LuxuryMode    schedule 20.01.2012
comment
Да, к сожалению, мне пришлось столкнуться с проблемами, вызванными фрагментацией Android. Однако, поскольку я не смог найти никаких ошибок, связанных с этим, а также я не смог найти другого телефона с ICS 4.0.1/4.0.2, я подумал, что, может быть, я пропустил что-то тривиальное, я зарегистрирую это как ошибку и посмотрю, есть ли у кого-нибудь отвечает. - person Slartibartfast; 20.01.2012
comment
Я говорю, что я не думаю, что это ошибка или необходимость, связанная с 4.0. Это просто аппаратное обеспечение Galaxy Nexus, не отвечающее на определенные параметры. Попробуйте удалить все параметры и добавить их обратно по одному и посмотреть, сможете ли вы найти неправильный параметр. - person LuxuryMode; 20.01.2012
comment
Размер предварительного просмотра — единственный устанавливаемый параметр. И я убедился, что этот же код работает в Galaxy Nexus 4.0.3. - person Slartibartfast; 20.01.2012
comment
Та же проблема — отлично работает на 2.3.3 и вылетает на 4.0.2 (Galaxy Nexus) - person AgentKnopf; 13.04.2012
comment
Меня интересует: как вообще ведет себя камера на нексусе 4.0.2? Я имею в виду приложение, поставляемое с телефоном, особенно если вы возитесь с некоторыми его параметрами (не в плане программирования, а в отношении того, что предлагает диалоговое окно камеры) - person AgentKnopf; 13.04.2012

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

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

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

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

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

person Anonsage    schedule 05.11.2012