0

Android SDK で初めて Camera を使用していますが、ほとんどの場合と同様に、初めて問題が発生します...

ポートレートで活動していますが、カメラの向きが非常に変です。文字通り、画像を横に反転させます。したがって、指を上から差し込むと、プレビューの左から入ってきます...私は何年もコードを微調整してきましたが、何も変更していません。ここに私のプレビュークラスがあります:

@Override
public void surfaceChanged(SurfaceHolder holder, int f, int w, int h) {
    Camera.Parameters params = camera.getParameters();
    params.setPreviewSize(w,h);
    params.set("orientation", "portrait");
    camera.setParameters(params);
    camera.startPreview();
}

@Override
public void surfaceCreated(SurfaceHolder h) {
    try {
        camera = Camera.open();
        camera.setPreviewDisplay(h);
        camera.setPreviewCallback(new PreviewCallback(){
            @Override
            public void onPreviewFrame(byte[] data, Camera c) {
                FileOutputStream fos = null;
                try {
                    //if(!(new File(Environment.getExternalStorageDirectory()+"/MemeMe/Temp/").exists())){
                    //  
                    //}
                    File memeTempPath = new File(Environment.getExternalStorageDirectory()+"/MemeMe/Temp/");
                    File[] tempFiles = memeTempPath.listFiles();
                    for(int i = 0; i < tempFiles.length; i++){
                        tempFiles[i].delete();
                    }
                    fos = new FileOutputStream(String.format(Environment.getExternalStorageDirectory()+"/MemeMe/Temp/"+System.currentTimeMillis()));
                    fos.write(data);
                    fos.close();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                Preview.this.invalidate();
            }
        });
    } catch (IOException e) {
        e.printStackTrace();
    }
}

今ここに私の活動があります:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

    preview = new Preview(this);
    previewL = (FrameLayout)findViewById(R.id.cameraLayout);
    previewL.addView(preview);

私はこの問題にかなり混乱しています。プレビューは方向に基づいて変更されるはずだと思っていました... params.setRotation() も実行しようとし、90,180,270,360 と考えられるすべての回転について実行しましたが、まったく変更されません。

マニフェスト:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
4

1 に答える 1

1

プレビューのために、カメラ画像の回転を調整する別の方法があります... setDisplayOrientation()のAndroidドキュメントで完全に説明されています。API レベル 8 以降で使用できます。

2.1 (レベル 7) の更新:

2.2 より前では、このコードは通常機能していました

Camera.Parameters parameters = camera.getParameters();
parameters.set("orientation", "portrait"); // for some
parameters.set("rotation", 90);  // for others
// or parameters.setRotation(90);
camera.setParameters(parameters);

問題は、2.2以降の一部のデバイスで動作を停止したように見えるため、2.1以降をサポートする必要がある場合は、リフレクションを試して、setDisplayOrientation失敗した場合は"orientation"パラメーターを設定できることです。

void setDisplayOrientation(Camera camera, int angle){
  try {
    Method method = camera.getClass().getMethod("setDisplayOrientation", new Class[] { int.class });
    if (method != null) {
      method.invoke(camera, new Object[] { angle });
      return;
    }
  } catch (Exception e) {}
  Camera.Parameters parameters = camera.getParameters();
  parameters.set("orientation", "portrait");
  parameters.set("rotation", 90);
  camera.setParameters(parameters);
}
于 2012-05-21T22:38:09.797 に答える