【问题标题】:android camera failed when using the camera api使用相机api时android相机失败
【发布时间】:2013-07-17 23:00:26
【问题描述】:

我在使用相机 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)

【问题讨论】:

  • 你能提供完整的堆栈跟踪吗?
  • 差不多了,我唯一的代码就是上面的代码,堆栈跟踪在 camera.takePicture 行显示错误
  • 很奇怪,应该有比这更多的信息。您是否查看了 ADB logcat 以了解更多信息?
  • 添加了logcat信息

标签: android android-camera


【解决方案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 的宽度/高度,以匹配相机预览尺寸的宽度/高度?

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

【讨论】:

  • 添加了logcat输出...我确实在预览中添加了一个surfaceview并在拍照之前调用startPreview...至于虚拟表面视图代码,我从stackoverflow.com/questions/10959767/…得到的跨度>
  • 如果您以后仍然遇到问题,我会在我下班后整理一个副本应用程序,看看我是否可以让它工作。我的直觉是它与 SurfaceView 有关。您是否尝试过将“真实”表面设置为预览表面(即位于主要活动布局中且具有隐式宽度/高度的表面)?
  • 另外..你确定相机打开成功了吗?
  • 看起来将surfaceview更改为surfacetexture可以修复错误。根据我的阅读,surfaceview 似乎仅适用于较旧的 android 版本?
  • 非常奇怪,尤其是因为有这么多使用 SurfaceView 作为虚拟预览的示例。您是否尝试过在 SurfaceView 上使用较低的 API/目标设备,看看它是否可以工作?很高兴你设法解决了这个问题:)
猜你喜欢
  • 2016-04-05
  • 2013-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-08
  • 2014-06-13
  • 1970-01-01
相关资源
最近更新 更多