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() 中重新打开()它)。

一个想法 - 当您使用虚拟 SurfaceView 时,您是否需要设置 SurfaceView 的宽度/高度,以匹配相机预览尺寸的宽度/高度?

如果没有完整的堆栈跟踪,我就无法辨别出您的代码有什么问题。

于 2013-07-17T14:23:08.833 回答