Вопрос

Наше приложение отображает предварительный просмотр камеры, и, похоже, оно отлично работает на всех телефонах, за исключением Motorola Droid, где мы получаем исключение во время выполнения при настройке параметров камеры:

    java.lang.RuntimeException: setParameters failed
   at android.hardware.Camera.native_setParameters(Native Method)
   at android.hardware.Camera.setParameters(Camera.java:611)
   at com.highwaynorth.andrometer.CameraPreviewSurfaceView.surfaceChanged(CameraPreviewSurfaceView.java:57)
   at android.view.SurfaceView.updateWindow(SurfaceView.java:460)
   at android.view.SurfaceView.dispatchDraw(SurfaceView.java:287)
   at android.view.ViewGroup.drawChild(ViewGroup.java:1525)

Вот код для surfaceChanged(), который в основном взят из АПИДемос

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
   // Now that the size is known, set up the camera parameters and begin
   // the preview.
   Camera.Parameters parameters = mCamera.getParameters();
   parameters.setPreviewSize(w, h);
   parameters.setPictureFormat(PixelFormat.JPEG);
   parameters.setPreviewFormat(PixelFormat.YCbCr_422_SP);
   parameters.setPreviewFrameRate(1);
   mCamera.setParameters(parameters);
   mCamera.startPreview();

}

Кто-нибудь знает, что не так с тем, как мы устанавливаем параметры, которые могли бы вызвать исключение в Motorola Droid?

Это было полезно?

Решение

Я могу сказать вам, что ваша проблема связана с одной из следующих двух строк:

parameters.setPreviewFormat(PixelFormat.YCbCr_422_SP);
parameters.setPreviewFrameRate(1);

Я знаю это, потому что остальная часть этого кода - это именно то, что я делаю в некоторых примерах камер в моей книге, и они были протестированы на ДРОИДЕ.

Возможно, вы захотите использовать getSupportedPreviewFormats() и getSupportedPreviewFrameRates() на вашем объекте Camera.Parameters, чтобы узнать, поддерживает ли данное устройство требуемый формат и частоту кадров.Обратите внимание, что эти методы являются новыми для Android 2.0, поэтому они будут работать на DROID / Milestone (и, предположительно, Nexus One), но больше ни на чем на момент написания этой статьи.Если вы ориентируетесь на более старые версии Android API, вам нужно будет использовать отражение или некоторые приемы загрузки классов, чтобы заставить эти методы работать на Android 2.0 и быть пропущенными в более старых версиях.

Другие советы

Вам следует проверить, какие форматы предварительного просмотра доступны, чтобы убедиться, что вы можете работать на как можно большем количестве устройств.

Похоже, DROID поддерживает PixelFormat.YCbCr_422_I PixelFormat.YCbCr_420_SP

вы можете использовать следующий метод, чтобы получить список доступных форматов.getSupportedPreviewFormats()

Пиксельные форматы

Еще одна вещь, которую вы, возможно, захотите исследовать:

Я сталкиваюсь с этой проблемой для устройств, работающих под управлением Motoblur и обновленных до версии 2.3 (особенно Droid2, DroidX и Atrix с Verizon).

Параметры камеры были в порядке, но в layout/capture.xml фон ViewfinderView установлен на прозрачный:

<com.google.zxing.client.android.ViewfinderView
   android:id="@+id/viewfinder_view" 
   android:layout_width="fill_parent" 
   android:layout_height="fill_parent" 
   android:background="@color/transparent"
/>

Что ж, похоже, что transparent для Motoblur на Android 2.3 не настолько прозрачен...

удаление

android:background="@color/transparent"

из видоискателя решилась моя проблема.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top