4

我正在使用以下 URL 提供的代码来尝试使用 Android Camera API:

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

这提出了几个问题,到目前为止,我一直在徒劳地寻找答案。

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)

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

谢谢大家。这个相机的东西让我发疯了。

PS 我正在 HTC Evo 上测试所有这些。

4

4 回答 4

8

对于 (1) 如果您正在为 api 级别 9 进行开发,您可以尝试在开发人员网站上发布的代码。

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

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

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

于 2011-07-29T16:25:24.207 回答
1

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

于 2011-02-21T23:32:01.760 回答
0

执行此代码:

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

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

}

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

于 2012-12-26T14:35:06.857 回答
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;
}
于 2015-01-01T08:14:35.750 回答