RuntimeException на Camera.setParameters () на нексус один - PullRequest
27 голосов
/ 12 января 2010

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

Ответы [ 7 ]

41 голосов
/ 13 января 2010

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

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

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

26 голосов
/ 03 февраля 2012

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

   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);
10 голосов
/ 02 января 2014

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

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

3 голосов
/ 19 ноября 2014

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

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

//now set your parameters
2 голосов
/ 30 марта 2015

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

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

и т.д.. Все это завернуто в хороший try {} 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;
    }
0 голосов
/ 19 марта 2015

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

Некоторые проекты камер с открытым исходным кодом, такие как 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...