Android: несколько вопросов по API камеры - PullRequest
4 голосов
/ 14 января 2011

Я использую код, предоставленный по следующему URL, чтобы попытаться работать с API камеры Android:

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;

Проблема, однако, в том, что когда я закрываю приложение, я получаю «Force Close» сследующее исключение в 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 ]

8 голосов
/ 29 июля 2011

Для (1), если вы разрабатываете для API уровня 9, вы можете попробовать код, который размещен на сайте разработчика .

Для (2) вам необходимо убедиться, что вы делаете следующее:

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

Как правило, перед вызовом release () вам нужно установить значение null для PrereviewCallback. Это известная проблема со стеком камеры

1 голос
/ 22 февраля 2011

О вашем втором вопросе: здесь кто-то опубликовал обходной путь.

0 голосов
/ 01 января 2015
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 голосов
/ 26 декабря 2012

Сделайте этот код:

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

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

}

Затем заново инициализируйте камеру в функции onResume.

...