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?

Foi útil?

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

Pixel Formatos

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top