web-dev-qa-db-ja.com

Nexus 1のCamera.setParameters()でのRuntimeException

ここでの答え からコードをコピーしましたが、まだRuntimeException:setParameters failed error on my nexus one。私のマニフェストファイルには、カメラとwake_lockのアクセス許可があります。これはエミュレータで機能し、ドロイドではエラーは発生しませんが、回転の問題があります。

27
Erik B

ほとんどの場合、無効なプレビューサイズが必要になります。 adb logcatの結果を確認すると、おそらく次のようなものが表示されます。

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

解決策は、希望するサイズに最も近い利用可能なプレビューサイズを要求することです。 Camera.ParametersCamera.getParameters によって返されるオブジェクトでgetSupportedPreviewSizesを呼び出すことにより、使用可能なプレビューサイズのリストを取得できます。

41
Roman Nurik

これを修正するには、Romanの発言をコードで行います。

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

それだけの価値があるのですが、私の問題の原因は、parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);をチェックしてフラッシュモードがサポートされていることを最初に確認せずにparameters.getFlashMode() != nullを呼び出そうとしたことです。

この不十分に文書化された例外には複数の原因があるため、supportedPreviewSizeを使用していることだけでなく、すべてのパラメーターを確認してください。

10
Andrew Coonce

上記のどれも私のためにこれを解決しませんでした。ただし、パラメータを設定する前にこのコードを追加しました。

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

//now set your parameters
3
aaronmarino

私の場合、これは写真を撮った後に起こり、プレビューがフリーズしました。パラメーターの呼び出しを次のように更新するまでです。このエラーでは、カメラが設定するように求めているすべてのパラメーターをチェックして、カメラに設定するように求めているすべてのパラメーターがカメラで可能であることを確認することが常に重要です。

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

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);
}
0
bang_chen

サムからの解決策は正しいですが、出力画像はいくつかのタブレットデバイスでまだ少しズームされています。インターネットで見つけたベストプラクティスの1つは、カメラが再開されるたびにプロパティが再利用されるように、カメラホストで設定する必要があります。 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
Long Thay