0

カメラAPIを使用してAndroidで写真を撮るのに問題があります。カメラの意図を使用するとうまくいくようですが、API を直接呼び出すとうまくいきません。

エラー: java.lang.RuntimeException: takePicture failed at android.hardware.Camera.native_takePicture

コード

public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  cameraId = findFrontFacingCamera();
  camera = Camera.open(cameraId);
  Parameters params = camera.getParameters();

  SurfaceView dummy=new SurfaceView(context);
  try {
      camera.setPreviewDisplay(dummy.getHolder());
      camera.startPreview();
      camera.takePicture(null, photoHandler, photoHandler);

  } catch (IOException e) {
      camera.stopPreview();
      camera.release();
  }  
}

 private PictureCallback photoHandler = new PictureCallback() {   
      @Override
      public void onPictureTaken(byte[] data, Camera camera) {
      }
 }

マニフェスト

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

猫の出力を記録する

07-17 10:16:02.523: D/MakePhotoActivity(14591): Camera found
07-17 10:16:02.773: D/dalvikvm(14591): threadid=1: still suspended after undo (sc=1 dc=1)
07-17 10:16:18.229: D/AndroidRuntime(14591): Shutting down VM
07-17 10:16:18.229: W/dalvikvm(14591): threadid=1: thread exiting with uncaught exception (group=0x40c4f930)
07-17 10:16:18.309: E/AndroidRuntime(14591): FATAL EXCEPTION: main
07-17 10:16:18.309: E/AndroidRuntime(14591): java.lang.RuntimeException: Unable to start activity ComponentInfo{tv.fakelove.stationtostation/tv.fakelove.stationtostation.MainActivity}: java.lang.RuntimeException: takePicture failed
07-17 10:16:18.309: E/AndroidRuntime(14591):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
07-17 10:16:18.309: E/AndroidRuntime(14591):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
07-17 10:16:18.309: E/AndroidRuntime(14591):    at android.app.ActivityThread.access$600(ActivityThread.java:141)
07-17 10:16:18.309: E/AndroidRuntime(14591):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
07-17 10:16:18.309: E/AndroidRuntime(14591):    at android.os.Handler.dispatchMessage(Handler.java:99)
07-17 10:16:18.309: E/AndroidRuntime(14591):    at android.os.Looper.loop(Looper.java:137)
07-17 10:16:18.309: E/AndroidRuntime(14591):    at android.app.ActivityThread.main(ActivityThread.java:5041)
07-17 10:16:18.309: E/AndroidRuntime(14591):    at java.lang.reflect.Method.invokeNative(Native Method)
07-17 10:16:18.309: E/AndroidRuntime(14591):    at java.lang.reflect.Method.invoke(Method.java:511)
07-17 10:16:18.309: E/AndroidRuntime(14591):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-17 10:16:18.309: E/AndroidRuntime(14591):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-17 10:16:18.309: E/AndroidRuntime(14591):    at dalvik.system.NativeStart.main(Native Method)
07-17 10:16:18.309: E/AndroidRuntime(14591): Caused by: java.lang.RuntimeException: takePicture failed
07-17 10:16:18.309: E/AndroidRuntime(14591):    at android.hardware.Camera.native_takePicture(Native Method)
07-17 10:16:18.309: E/AndroidRuntime(14591):    at android.hardware.Camera.takePicture(Camera.java:1095)
07-17 10:16:18.309: E/AndroidRuntime(14591):    at android.hardware.Camera.takePicture(Camera.java:1040)
07-17 10:16:18.309: E/AndroidRuntime(14591):    at tv.fakelove.stationtostation.MainActivity.onCreate(MainActivity.java:59)
07-17 10:16:18.309: E/AndroidRuntime(14591):    at android.app.Activity.performCreate(Activity.java:5104)
07-17 10:16:18.309: E/AndroidRuntime(14591):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
07-17 10:16:18.309: E/AndroidRuntime(14591):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
4

1 に答える 1

1

前の質問で提供された回答を確認してください: Android: "Camera.takePicture failed" Exception

どうやら、写真を撮る前にプレビューを開始する必要があるようです。これには、有効なプレビュー サーフェスの設定が含まれます (これは行っていないと思います)。

また、http://developer.android.com/reference/android/hardware/Camera.html にある手順 5 ~ 6 を確認してください

  1. open(int) から Camera のインスタンスを取得します。
  2. getParameters() で既存の (デフォルト) 設定を取得します。
  3. 必要に応じて、返された Camera.Parameters オブジェクトを変更し、setParameters(Camera.Parameters) を呼び出します。
  4. 必要に応じて、setDisplayOrientation(int) を呼び出します。
  5. 重要: 完全に初期化された SurfaceHolder を setPreviewDisplay(SurfaceHolder) に渡します。サーフェスがないと、カメラはプレビューを開始できません。
  6. 重要: プレビュー サーフェスの更新を開始するには、startPreview() を呼び出します。写真を撮る前に、プレビューを開始する必要があります。
  7. 必要に応じて、 takePicture(Camera.ShutterCallback, Camera.PictureCallback, Camera.PictureCallback, Camera.PictureCallback) を呼び出して写真をキャプチャします。コールバックが実際の画像データを提供するまで待ちます。
  8. 撮影後、プレビュー表示は停止します。さらに写真を撮るには、最初に startPreview() を再度呼び出します。
  9. stopPreview() を呼び出して、プレビュー サーフェスの更新を停止します。
  10. 重要: release() を呼び出して、他のアプリケーションで使用できるようにカメラを解放します。アプリケーションは、onPause() ですぐにカメラを解放する必要があります (onResume() で reopen() します)。

1つの考え-ダミーのSurfaceViewを使用しているため、SurfaceViewの幅/高さを設定して、カメラのプレビューサイズの幅/高さに合わせる必要がありますか?

完全なスタック トレースがなければ、あなたのコードに問題があることを認識できるほど多くはありません。

于 2013-07-17T14:23:08.833 に答える