RuntimeException em Camera.setParameters () sobre um nexo

votos
27

Copiei o código a resposta aqui e ainda estou recebendo um RuntimeException: setParameters falhou erro no meu Nexus One. Meu arquivo de manifesto tem câmera e WAKE_LOCK permissões. Isso funciona no emulador, e no Droid eu não recebo o erro, mas ele tem um problema de rotação.

Publicado 12/01/2010 em 04:28
fonte usuário
Em outras línguas...                            


7 respostas

votos
41

Você está provavelmente requsting um tamanho pré-visualização inválido. Se você verificar os resultados de adb logcatque você provavelmente vai ver algo como isto:

E/QualcommCameraHardware(22732): Invalid preview size requested: 480x724

A solução é solicitar o tamanho mais próximo visualização disponível para o que você gostaria; você pode obter uma lista de tamanhos de visualização disponível chamando getSupportedPreviewSizesnos Camera.Parameters objeto retornado por Camera.getParameters .

Respondeu 12/01/2010 em 23:27
fonte usuário

votos
26

Eu corrigi isso fazendo o que Roman disse, com o código:

   Camera.Parameters parameters = camera.getParameters();  
   List<Camera.Size> sizes = parameters.getSupportedPreviewSizes();  
   Camera.Size cs = sizes.get(0);  
   parameters.setPreviewSize(cs.width, cs.height);  
   camera.setParameters(parameters);
Respondeu 03/02/2012 em 11:07
fonte usuário

votos
10

Por que vale a pena, a fonte do meu problema acabou sendo que eu estava tentando chamar parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);sem antes verificar que os modos de flash foram apoiados por verificar que parameters.getFlashMode() != null.

Há mais de uma causa para essa exceção mal documentadas, de modo a verificar todos os seus parâmetros e não apenas que você está usando um supportedPreviewSize.

Respondeu 02/01/2014 em 19:32
fonte usuário

votos
3

Nenhuma das opções acima resolvido isso por mim. Adicionando este código antes de definir os parâmetros fez embora.

// stop preview before making changes
    try {
        mCamera.stopPreview();
    } catch (Exception e){
        // ignore: tried to stop a non-existent preview
    }

//now set your parameters
Respondeu 19/11/2014 em 11:27
fonte usuário

votos
2

Para mim isso iria acontecer depois de tomar uma foto e de visualização iria congelar, até que eu atualizei meu pedido de parâmetros a ser o seguinte. É sempre importante com este erro para certificar-se de verificar todos os parâmetros que a câmara está pedindo para definir se certificar de que todos os parâmetros que você está pedindo a câmera para definir se a é possível para a câmera.

Camera.Parameters parameters = myCamera.getParameters();

Com o tamanho da visualização:

if (myCamera.getParameters().getSupportedPreviewSizes() != null){
     Camera.Size previewSize = getOptimalPreviewSize(myCamera.getParameters().getSupportedPreviewSizes(), width, height);;
     parameters.setPreviewSize(previewSize.width, previewSize.height);
}

Com os modos de flash / foco:

if(parameters.getSupportedFocusModes() != null && parameters.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)){
     parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
}

if (parameters.getSupportedFlashModes() != null && parameters.getSupportedFlashModes().contains(Camera.Parameters.FLASH_MODE_AUTO)){
    parameters.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO);

}

myCamera.setParameters(parameters);

etc. Tudo isso envolto em um belo try {} catch () {} funciona muito bem. Boa sorte.

Aqui é o tamanho getOptimalPreview a partir desta grande tutorial :

private Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int width, int height)
    {
        // Source: http://stackoverflow.com/questions/7942378/android-camera-will-not-work-startpreview-fails
        Camera.Size optimalSize = null;

        final double ASPECT_TOLERANCE = 0.1;
        double targetRatio = (double) height / width;

        // Try to find a size match which suits the whole screen minus the menu on the left.
        for (Camera.Size size : sizes){

            if (size.height != width) continue;
            double ratio = (double) size.width / size.height;
            if (ratio <= targetRatio + ASPECT_TOLERANCE && ratio >= targetRatio - ASPECT_TOLERANCE){
                optimalSize = size;
            }
        }

        // If we cannot find the one that matches the aspect ratio, ignore the requirement.
        if (optimalSize == null) {
            // TODO : Backup in case we don't get a size.
        }

        return optimalSize;
    }
Respondeu 30/03/2015 em 03:40
fonte usuário

votos
0

a solução de Sam está correta, mas a imagem de saída ainda é ampliada um pouco em vários dispositivos tablet. Uma das melhores práticas que eu encontrei na Internet, devemos definir no anfitrião Camera de modo que as propriedades serão reutilizados a cada vez que a câmera é retomada. Aqui é método implementado em CameraHost:

@Override
        public Parameters adjustPreviewParameters(Parameters parameters) {
            List<Camera.Size> sizes = parameters.getSupportedPreviewSizes();
            Camera.Size cs = sizes.get(0);
            parameters.setPreviewSize(cs.width, cs.height);
            return super.adjustPreviewParameters(parameters);
        }
Respondeu 19/03/2015 em 04:21
fonte usuário

votos
0

Algum projeto de câmera de fonte aberta como opencamera sempre usar try-catchpara chamar Camera.setParameters:

private void setCameraParameters(Camera.Parameters parameters) {
    if( MyDebug.LOG )
        Log.d(TAG, "setCameraParameters");
    try {
        camera.setParameters(parameters);
        if( MyDebug.LOG )
            Log.d(TAG, "done");
    } catch (RuntimeException e) {
        // just in case something has gone wrong
        if( MyDebug.LOG )
            Log.d(TAG, "failed to set parameters");
        e.printStackTrace();
        count_camera_parameters_exception++;
    }
}

Além disso, obter sempre a última getParametersantes de chamar setParametersassim:

void setRotation(int rotation) {
    Camera.Parameters parameters = this.getParameters();
    parameters.setRotation(rotation);
    setCameraParameters(parameters);
}
Respondeu 14/01/2015 em 09:39
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more