2013-07-17 68 views
0

我在使用相机api在Android中拍照时遇到问题。使用相机意图似乎工作正常,但不是当我直接调用API。安卓相机使用相机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) 
+0

你能提供完整的堆栈跟踪吗? – Seidr

+0

这是非常多的,我唯一的代码是上面的和堆栈跟踪显示错误在线camera.take图片 – MonkeyBonkey

+0

非常奇怪,应该有更多的信息可用比。您是否检查过ADB logcat以获取更多信息? – Seidr

回答

1

退房的answe r在前面的问题中提供:Android: "Camera.takePicture failed" Exception

显然你需要在拍摄照片之前开始预览,其中包括设置有效的预览表面(我不认为你在做什么)。

此外,检查步骤5-6在http://developer.android.com/reference/android/hardware/Camera.html

  1. Obtain an instance of Camera from open(int).
  2. Get existing (default) settings with getParameters().
  3. If necessary, modify the returned Camera.Parameters object and call setParameters(Camera.Parameters).
  4. If desired, call setDisplayOrientation(int).
  5. Important: Pass a fully initialized SurfaceHolder to setPreviewDisplay(SurfaceHolder). Without a surface, the camera will be unable to start the preview.
  6. Important: Call startPreview() to start updating the preview surface. Preview must be started before you can take a picture.
  7. When you want, call takePicture(Camera.ShutterCallback, Camera.PictureCallback, Camera.PictureCallback, Camera.PictureCallback) to capture a photo. Wait for the callbacks to provide the actual image data.
  8. After taking a picture, preview display will have stopped. To take more photos, call startPreview() again first.
  9. Call stopPreview() to stop updating the preview surface.
  10. Important: Call release() to release the camera for use by other applications. Applications should release the camera immediately in onPause() (and re-open() it in onResume()).

一个想法奠定了 - 因为你使用的是虚拟SurfaceView,你就需要设置SurfaceView的宽度/高度,以配合相机预览尺寸的宽度/高度?

没有完整的堆栈跟踪,没有更多的东西我可以看出你的代码有问题。

+0

添加了logcat输出...我添加了一个surfaceview到预览并在拍摄pic之前调用startPreview ...对于虚拟表面视图代码,我从http://stackoverflow.com获得了/ questions/10959767 /隐形表面视图相机预览 – MonkeyBonkey

+0

如果您以后仍然遇到问题,我会在下班后再放置一个副本应用程序,并查看是否可以使其工作。我的直觉是这与SurfaceView有关。你有没有尝试设置一个'真实'的Surface作为预览表面(即在主活动布局中,并且有一个隐含的宽度/高度)? – Seidr

+0

作为补充..确定相机正在成功打开吗? – Seidr