Подтвердить что ты не робот

RuntimeException на Camera.setParameters() на nexus one

Я скопировал код из ответа здесь, и я все еще получаю RuntimeException: ошибка setParameters с ошибкой в ​​моей связи. Мой файл манифеста имеет разрешения камеры и wake_lock. Это работает на эмуляторе, а на дроиде я не получаю ошибку, но у нее есть проблема с вращением.

4b9b3361

Ответ 1

Скорее всего, вы указали недопустимый размер предварительного просмотра. Если вы проверите результаты adb logcat, вы, вероятно, увидите что-то вроде этого:

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

Решение состоит в том, чтобы запросить самый близкий доступный размер предварительного просмотра к тому, который вам нужен; вы можете получить список доступных размеров предварительного просмотра, вызвав getSupportedPreviewSizes в Camera.Parameters объект, возвращенный Camera.getParameters.

Ответ 2

Я исправил это, выполнив то, что сказал Роман, с кодом:

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

Ответ 3

Для того, что стоит, источником моей проблемы стало то, что я пытался вызвать parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); без предварительной проверки того, что режимы вспышки поддерживаются, проверяя, что parameters.getFlashMode() != null.

Для этого плохо документированного исключения существует несколько причин, поэтому проверьте все свои параметры, а не только на то, что вы используете supportedPreviewSize.

Ответ 4

Ничто из этого не разрешило мне это. Однако добавление этого кода перед настройкой параметров.

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

//now set your parameters

Ответ 5

Для меня это произойдет после того, как вы сделаете снимок, и просмотр будет заморожен, пока я не обновил свой запрос на параметры, чтобы быть следующим. При этой ошибке всегда важно убедиться в том, что вы проверяете все параметры, которые камера запрашивает, чтобы убедиться, что для каждого параметра, который вы запрашиваете для камеры, возможно для камеры.

Camera.Parameters parameters = myCamera.getParameters();

С размером предварительного просмотра:

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

С режимами вспышки/фокусировки:

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

и т.д.. Все это завернуто в приятную попытку {} catch() {} отлично работает. Удачи.

Вот размер getOptimalPreview из этот отличный учебник:

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;
    }

Ответ 6

Некоторые проекты с открытым исходным кодом, такие как opencamera, всегда используют try-catch для вызова параметров 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++;
    }
}

Кроме того, всегда получайте последнюю getParameters, прежде чем вы вызываете setParameters следующим образом:

void setRotation(int rotation) {
    Camera.Parameters parameters = this.getParameters();
    parameters.setRotation(rotation);
    setCameraParameters(parameters);
}

Ответ 7

решение от Сэма правильное, но выходное изображение по-прежнему немного уменьшено на нескольких планшетных устройствах. Одна из лучших практик, которые я нашел в Интернете, мы должны установить в хосте Camera так, чтобы свойства были повторно использованы каждый раз, когда камера возобновляется. Вот реализованный метод в 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);
        }