我在我的代码中使用虚拟表面.它在运行4.2.1的Canvas HD中运行良好但是当我的nexus 5/S 3上部署了相同的应用程序时,它在camera.takepicture上提供RunTimeException
这是我的代码
{
camera = Camera.open(cameraId);
if (camera != null)
{
SurfaceView dummy = new SurfaceView(context);
try {
camera.setPreviewDisplay(dummy.getHolder());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
camera.startPreview();
camera.takePicture(null, null, new PhotoHandler(context));
}
Run Code Online (Sandbox Code Playgroud)
logcat的:
07-17 22:46:49.281: E/AndroidRuntime(481): FATAL EXCEPTION: main
07-17 22:46:49.281: E/AndroidRuntime(481): Process: com.example.ex, PID: 481
07-17 22:46:49.281: E/AndroidRuntime(481): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.ex/com.example.ex.MainActivity}: java.lang.RuntimeException: takePicture failed
07-17 22:46:49.281: E/AndroidRuntime(481): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184)
07-17 22:46:49.281: E/AndroidRuntime(481): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
07-17 22:46:49.281: E/AndroidRuntime(481): at …Run Code Online (Sandbox Code Playgroud) 我正在编写一个Android应用程序来拍照.代码在onPreviewFrame(byte []数据,Camera camera)中从预览中获取帧后进行一些处理.问题是android.hardware.Camera的函数takePicture()有时会完全按照我想要的方式执行,有时不会返回,也不会调用任何回调.当我运行应用程序时,第一张照片不会返回,有时我可以拍摄四张照片而第五张会导致应用程序挂起.有一个类似的线程:使用Android相机拍照的问题.建议的解决方案是使用上次预览的框架,但肯定不是一个好的解决方案!这个问题可能会引发因为takePicture是Asancronous(Android Doc).
我只需像这样调用takePicture()函数:
public static void takePicture() {
mCamera.takePicture(null, null, jpegCallback);
}
Run Code Online (Sandbox Code Playgroud)
这是Logcat输出的链接.您可以使用短语"takePicture"在输出中搜索,您将看到此函数有时会返回,有时不会返回.
这是takePicture返回时的输出:
10-02 19:24:36.570: INFO/ShotSingle(3198): ShotSingle::takePicture start
10-02 19:24:36.570: DEBUG/CameraHal(3198): 2489: takePicture() ENTER
10-02 19:24:36.570: DEBUG/MessageQueue(3198): MQ.put(5,0xb6590,0x0,0x8,0x80b0af55)
10-02 19:24:36.570: DEBUG/MessageQueue(3198): MessageQueue::put EXIT
10-02 19:24:36.578: DEBUG/MessageQueue(3198): MQ.get(5,0xb6590,0x0,0x8,0x80b0af55)
10-02 19:24:36.578: DEBUG/CameraHal(3198): 1458: CameraStop() ENTER
10-02 19:24:36.617: DEBUG/CameraHal(3198): 1543: CameraStop() EXIT
10-02 19:24:36.617: DEBUG/MessageQueue(3198): MQ.put(14,0xb6590,0x0,0x8,0x80b0af55)
10-02 19:24:36.617: DEBUG/MessageQueue(3198): MQ.get(14,0xb6590,0x0,0x8,0x80b0af55)
10-02 19:24:36.617: DEBUG/CameraHal(3198): 2497: takePicture() EXIT
10-02 19:24:36.617: INFO/ShotSingle(3198): ShotSingle::takePicture end
Run Code Online (Sandbox Code Playgroud)
这是takePicture不返回时的输出:
10-02 19:25:20.671: INFO/ShotSingle(3198): …Run Code Online (Sandbox Code Playgroud)