Camera Preview no Motorola Droid
-
19-09-2019 - |
Pergunta
Nossos aplicativo exibe uma visualização da câmera e parece funcionar bem em todos os telefones, exceto para o Motorola Droid, onde temos uma exceção tempo de execução quando definir os parâmetros da câmara:
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)
Aqui está o código para surfaceChanged (), que é principalmente tomada de APIDemos
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();
}
Alguém sabe o que está errado com a forma como estamos definindo os parâmetros que iria estar causando a exceção na Motorola Droid?
Solução
Eu posso dizer-lhe o seu problema é com uma das duas linhas seguintes:
parameters.setPreviewFormat(PixelFormat.YCbCr_422_SP);
parameters.setPreviewFrameRate(1);
Eu sei que isso, porque o resto do que o código é apenas o que eu faço em algumas amostras câmera em meu livro, e eles já foram testados em uma DROID.
Você pode querer usar getSupportedPreviewFormats()
e getSupportedPreviewFrameRates()
em seus Camera.Parameters objeto, para ver se o dispositivo em questão suporta o formato ea taxa de quadros que você procura. Note-se que esses métodos são novos para o Android 2.0, então eles vão trabalhar no Droid / Milestone (e, presumivelmente, o Nexus One), mas nada mais no momento da redação deste texto. Se você está direcionando versões mais antigas da API do Android, você vai precisar usar a reflexão ou alguns truques classloading para obter esses métodos para trabalhar no Android 2.0 e ser ignorada em versões mais antigas.
Outras dicas
Você deve verificar o que estão disponíveis para se certificar de que você pode executar em quantos dispositivos como possíveis formatos de visualização.
Parece suportes DROID PixelFormat.YCbCr_422_I PixelFormat.YCbCr_420_SP
Você pode usar o seguinte método para obter uma lista de formatos disponíveis. getSupportedPreviewFormats ()
Outra coisa que você pode querer investigar:
Eu estou enfrentando esse problema para dispositivos que executam Motoblur e atualizado para 2.3 (especialmente Droid2, DroidX e Atrix com a Verizon).
Os parâmetros da câmara eram bons, mas no layout / capture.xml o fundo da ViewfinderView definiu como transparente:
<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"
/>
Bem, parece que transparente para Motoblur no Android 2.3 não é tão transparente ...
remover
android:background="@color/transparent"
No visor resolveu o meu problema.