Android:几个相机API问题

mah*_*eng 4 api android release orientation android-camera

我使用以下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);
Run Code Online (Sandbox Code Playgroud)

我试过做同样的事情surfaceChanged(...).当然,我也在清单中将我的方向设置为肖像如下:

android:screenOrientation="portrait"
Run Code Online (Sandbox Code Playgroud)

有没有人对我做错了什么以及如何解决它有任何建议?

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

camera.stopPreview();
camera = null;
Run Code Online (Sandbox Code Playgroud)

没有什么可以释放相机资源,因此在运行此应用程序后,任何使用相机的后续应用程序都将无法工作.我试图解决这个问题,我添加了一个释放资源的调用,如下所示:

camera.stopPreview();
camera.release();
camera = null;
Run Code Online (Sandbox Code Playgroud)

但问题是,当我关闭应用程序时,我在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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 8

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

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

    if (mCamera != null) {
        mCamera.setPreviewCallback(null);
        mCamera.release();
        mCamera = null;
    }
Run Code Online (Sandbox Code Playgroud)

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