2011-01-14 2 views
3

Я использую код, предоставленный по следующему URL-адресу, чтобы попытаться работать с Android API камеры: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; 

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

Может ли кто-нибудь сказать мне, почему я не могу освободить ресурсы камеры там?

Благодарим вас заблаговременно. Эта вещь камеры меня заводит.

P.S. Я тестирую все это на HTC Evo.

ответ

8

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

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

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

В основном перед вызовом Release() вы должны setPreviewCallback к нулю. Это известная проблема со стеком камеры

0

ли этот код:

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

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

} 

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

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; 
}