Android: 相机API的几个问题

4

我正在使用以下网址提供的代码尝试使用Android相机API:

http://marakana.com/forums/android/examples/39.html

This has raised several questions that I have tried in vain to find the answers to so far.
1) 我的应用程序需要纵向方向,但我看到的所有代码示例(包括上面提到的URL中的示例)似乎都依赖于横向方向。事实上,迄今为止,无论我尝试了什么,似乎都无法避免横向方向。我已经尝试在surfaceCreated(...) 中强制参数,如下所示:
Camera.Parameters parameters = camera.getParameters();
parameters.set("orientation", "portrait");
parameters.set("rotation", "90");
camera.setParameters(parameters);

我尝试在 surfaceChanged(...) 中执行相同的操作。当然,我也按照以下方式在清单中将方向设置为纵向:
android:screenOrientation="portrait"

请问有人能提供建议,告诉我哪里做错了以及如何修复吗?

2)我还有一个问题与释放相机资源有关。在上面引用文章的代码中,以下内容在 surfaceDestroyed(...) 方法中被调用:

camera.stopPreview();
camera = null;

目前没有释放相机资源的方法,因此在运行该应用程序后,任何使用相机的后续应用程序都将无法工作。为了解决这个问题,我添加了一个调用来释放资源,如下所示:

camera.stopPreview();
camera.release();
camera = null;

然而,问题在于当我关闭应用程序时,在LogCat中出现以下异常,导致“强制关闭”:

FATAL EXCEPTION: main
java.lang.RuntimeException: Method called after release()
    at android.hardware.Camera.setHasPreviewCallback(Native Method)
    at android.hardware.Camera.access$600(Camera.java:58)
    at android.hardware.Camera.$EventHandler.handleMessage(Camera.java:344)
    at android.os.Handler.dispatchMessage(Handler.java.99)
    at android.os.Looper.loop(Looper.java:144)
    at android.app.ActivityThread.main(ActivityThread.java:4937)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lanf.reflect.Method.invoke(Method.java:521)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
    at dalvik.system.NativeStart.main(Native Method)

有人能告诉我为什么我不能在那里释放相机资源吗?

提前感谢大家。这相机问题让我抓狂。

附言:我正在HTC Evo上测试所有这些。

4个回答

8

如果您正在开发 API 级别为 9 的应用程序,可以尝试在开发者网站上发布的代码。

对于 (2),您需要确保执行以下操作:

    if (mCamera != null) {
        mCamera.setPreviewCallback(null);
        mCamera.release();
        mCamera = null;
    }

在调用 release() 之前,您需要将 setPreviewCallback 设置为 null。这是相机堆栈的已知问题。


1
关于你的第二个问题: 这里有人发布了一个解决方法。

0
public void surfaceDestroyed(SurfaceHolder holder) {
    // Surface will be destroyed when we return, so stop the preview.
    // Because the CameraDevice object is not a shared resource, it's very
    // important to release it when the activity is paused.
    mCamera.setPreviewCallback(null);
    mCamera.stopPreview();
    mCamera.release();
    mCamera = null;
}

0

执行这段代码:

@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) { 
    this.getHolder().removeCallback(this);
    mCamera.stopPreview();

    mCamera.release();
    mCamera = null;
  Log.e("surfaceDestroyed", "surfaceDestroyed");

}

然后,在onResume函数中重新初始化相机。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接