2012-01-20 1 views
2

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

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

// 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) 

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

ответ

2

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

+0

Да, я, к сожалению, имел свою долю в решении проблем, вызванных фрагментацией андроида. Однако, поскольку я не мог найти никаких ошибок, связанных с этим, а также не мог найти другого телефона с поддержкой ICS 4.0.1/4.0.2, я подумал, может быть, я пропустил что-то тривиальное, я напишу его как ошибку и посмотрю, отвечает. – Slartibartfast

+1

То, что я говорю, это то, что я не думаю, что это ошибка или связанная с 4.0. Это просто аппаратное обеспечение Galaxy Nexus, неспособное реагировать на определенные параметры. Попробуйте удалить все параметры и добавить их обратно по одному и посмотреть, можете ли вы найти параметр нарушения. – LuxuryMode

+0

Размер предварительного просмотра является единственным параметром. И я убедился, что тот же код работает в Galaxy Nexus 4.0.3. – Slartibartfast

1

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

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

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

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

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