ここでの答え からコードをコピーしましたが、まだRuntimeException:setParameters failed error on my nexus one。私のマニフェストファイルには、カメラとwake_lockのアクセス許可があります。これはエミュレータで機能し、ドロイドではエラーは発生しませんが、回転の問題があります。
ほとんどの場合、無効なプレビューサイズが必要になります。 adb logcat
の結果を確認すると、おそらく次のようなものが表示されます。
E/QualcommCameraHardware(22732): Invalid preview size requested: 480x724
解決策は、希望するサイズに最も近い利用可能なプレビューサイズを要求することです。 Camera.ParametersCamera.getParameters によって返されるオブジェクトでgetSupportedPreviewSizes
を呼び出すことにより、使用可能なプレビューサイズのリストを取得できます。
これを修正するには、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);
それだけの価値があるのですが、私の問題の原因は、parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
をチェックしてフラッシュモードがサポートされていることを最初に確認せずにparameters.getFlashMode() != null
を呼び出そうとしたことです。
この不十分に文書化された例外には複数の原因があるため、supportedPreviewSize
を使用していることだけでなく、すべてのパラメーターを確認してください。
上記のどれも私のためにこれを解決しませんでした。ただし、パラメータを設定する前にこのコードを追加しました。
// stop preview before making changes
try {
mCamera.stopPreview();
} catch (Exception e){
// ignore: tried to stop a non-existent preview
}
//now set your parameters
私の場合、これは写真を撮った後に起こり、プレビューがフリーズしました。パラメーターの呼び出しを次のように更新するまでです。このエラーでは、カメラが設定するように求めているすべてのパラメーターをチェックして、カメラに設定するように求めているすべてのパラメーターがカメラで可能であることを確認することが常に重要です。
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;
}
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);
}
サムからの解決策は正しいですが、出力画像はいくつかのタブレットデバイスでまだ少しズームされています。インターネットで見つけたベストプラクティスの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);
}