Android Camera.takePicture() 有时不返回?

Posted

技术标签:

【中文标题】Android Camera.takePicture() 有时不返回?【英文标题】:Android Camera.takePicture() does not return some times? 【发布时间】:2011-11-29 11:40:05 【问题描述】:

我正在为android 写一个应用程序来拍照。代码在从 onPreviewFrame(byte[] data, Camera camera) 中的预览中获取帧后进行一些处理。 问题在于 android.hardware.Camera 的函数 takePicture() 有时会完全按照我的意愿执行,有时不会返回并且不会调用回调。当我运行应用程序时,有时拍摄第一张照片不会返回,有时我可以拍摄四张照片,而第五张会导致应用程序挂起。有一个类似的线程:problem with taking pictures using the android camera。建议的解决方案是使用上次预览的框架,但肯定不是一个好的解决方案!由于 takePicture 是 Asancronous (Android Doc),因此可能会出现此问题。

我只是像这样调用 takePicture() 函数:

public static void takePicture() 
   mCamera.takePicture(null, null, jpegCallback);

Here 是 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

这是 takePicture 没有返回时的输出:

10-02 19:25:20.671: INFO/ShotSingle(3198): ShotSingle::takePicture start
10-02 19:25:20.671: DEBUG/CameraHal(3198): 2489: takePicture() ENTER
10-02 19:25:20.671: DEBUG/MessageQueue(3198): MQ.put(5,0xb8cb8,0x0,0x8,0x80b0af55)
10-02 19:25:20.671: DEBUG/MessageQueue(3198): MessageQueue::put EXIT
10-02 19:25:21.343: INFO/StatusBarPolicy(3393): onSignalStrengthsChanged
10-02 19:25:22.609: WARN/PowerManagerService(3330): Timer 0x7->0x3|0x7
10-02 19:25:23.062: INFO/AudiostreamOutALSA(3198): (virtual android::status_t android::AudioStreamOutALSA::standby())  enter
10-02 19:25:23.125: ERROR/AudioStreamOutALSA(3198): Output standby called!!. Turn off PCM device.
10-02 19:25:23.125: INFO/ALSAStreamOps(3198): [ALSAStreamOps]codecOff mode = 0
10-02 19:25:23.234: INFO/AudioStreamOutALSA(3198): [AudioOutLock]Relase_wake_Lock 

有人对此问题有任何解释或解决方案吗?

【问题讨论】:

这是根本原因:code.google.com/p/android/issues/detail?id=13966 【参考方案1】:

问题似乎是由于内存不足造成的。我通过在调用 takePicture() 之前添加 System.gc() 解决了这个问题。

System.gc();
CameraParameters.mCamera.takePicture(null, null, jpegCallback);

【讨论】:

System.gc(); 不建议在您的代码中使用。【参考方案2】:

请参阅this。如果您使用的是预览回调,则可以通过在拍照前将其删除来解决问题。

mCamera.setPreviewCallback(null);
mCamera.takePicture(null, null, mPictureCallback);

【讨论】:

以上是关于Android Camera.takePicture() 有时不返回?的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )

android 21 是啥版本

Android逆向-Android基础逆向(2-2)

【Android笔记】android Toast

图解Android - Android核心机制

Android游戏开发大全的目录