2013-02-20 34 views
0

當我的活動進入後臺時,如何釋放相機? (例如通過按電話上的待機按鈕)Android:活動進入後臺時如何使用相機?

public void onPause(){ 
    super.onPause(); 
    if (cam != null) { 
     cam.stopPreview(); 
     cam.release(); 
     cam = null; 
    } 
} 

@Override 
protected void onResume(){ 
super.onResume(); 
    rLayout = (RelativeLayout) findViewById (R.id.layout_background); 
    cam = Camera.open(); 
    cam.startPreview(); 
    p = cam.getParameters(); 
} 

logcat的:

02-20 11:46:40.040: E/AndroidRuntime(26439): FATAL EXCEPTION: main 
02-20 11:46:40.040: E/AndroidRuntime(26439): java.lang.RuntimeException: Unable to resume activity {spicysoftware.spicytaschenlampe/spicysoftware.spicytaschenlampe.FlashLight}: java.lang.RuntimeException: Fail to connect to camera service 
02-20 11:46:40.040: E/AndroidRuntime(26439): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2616) 
02-20 11:46:40.040: E/AndroidRuntime(26439): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2644) 
02-20 11:46:40.040: E/AndroidRuntime(26439): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2130) 
02-20 11:46:40.040: E/AndroidRuntime(26439): at android.app.ActivityThread.access$600(ActivityThread.java:140) 
02-20 11:46:40.040: E/AndroidRuntime(26439): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1227) 
02-20 11:46:40.040: E/AndroidRuntime(26439): at android.os.Handler.dispatchMessage(Handler.java:99) 
02-20 11:46:40.040: E/AndroidRuntime(26439): at android.os.Looper.loop(Looper.java:137) 
02-20 11:46:40.040: E/AndroidRuntime(26439): at android.app.ActivityThread.main(ActivityThread.java:4898) 
02-20 11:46:40.040: E/AndroidRuntime(26439): at java.lang.reflect.Method.invokeNative(Native Method) 
02-20 11:46:40.040: E/AndroidRuntime(26439): at java.lang.reflect.Method.invoke(Method.java:511) 
02-20 11:46:40.040: E/AndroidRuntime(26439): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1008) 
02-20 11:46:40.040: E/AndroidRuntime(26439): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:775) 
02-20 11:46:40.040: E/AndroidRuntime(26439): at dalvik.system.NativeStart.main(Native Method) 
02-20 11:46:40.040: E/AndroidRuntime(26439): Caused by: java.lang.RuntimeException: Fail to connect to camera service 
02-20 11:46:40.040: E/AndroidRuntime(26439): at android.hardware.Camera.native_setup(Native Method) 
02-20 11:46:40.040: E/AndroidRuntime(26439): at android.hardware.Camera.<init>(Camera.java:353) 
02-20 11:46:40.040: E/AndroidRuntime(26439): at android.hardware.Camera.open(Camera.java:330) 
02-20 11:46:40.040: E/AndroidRuntime(26439): at spicysoftware.spicytaschenlampe.FlashLight.onResume(FlashLight.java:182) 
02-20 11:46:40.040: E/AndroidRuntime(26439): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1199) 
02-20 11:46:40.040: E/AndroidRuntime(26439): at android.app.Activity.performResume(Activity.java:5280) 
02-20 11:46:40.040: E/AndroidRuntime(26439): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2606) 
02-20 11:46:40.040: E/AndroidRuntime(26439): ... 12 more 

這是如何其工作:

public void onPause(){ 
    super.onPause(); 
    Log.v("OnPause", "True"); 
    if (cam != null) { 
     Log.v("OnPause", "Cam isn't null"); 
     cam.stopPreview(); 
     Log.v("OnPause", "CamPreview stopped"); 
     cam.release(); 
     Log.v("OnPause", "CamReleased"); 
     cam = null; 
     Log.v("OnPause", "Cam is null"); 
    } 
} 


@Override 
protected void onResume(){ 
super.onResume(); 
Log.v("OnResume", "True"); 
    if(cam != null){ 
     Log.v("OnResume", "Camera is in use"); 
    } else { 
     Log.v("OnResume", "Camera isn't in use"); 
     rLayout = (RelativeLayout) findViewById (R.id.layout_background); 
     cam = Camera.open(); 
     Log.v("OnResume", "Camera has been opened"); 
     cam.startPreview(); 
     Log.v("OnResume", "CamPreview started"); 
     p = cam.getParameters(); 
     Log.v("OnResume", "Wrote parameters to variable p"); 
    } 
} 

打開相機中的onResume不崩潰該應用。

問候 MSeiz5

回答

1

重新打開並重置您的相機的onResume。

@Override 
protected void onResume(){ 
super.onResume(); 
camera = Camera.open(); 

// We resumed so lock the camera 
Camera.Parameters params = camera.getParameters(); 

params.setFlashMode(Parameters.FLASH_MODE_ON); 
//params.setFocusMode(Parameters.FOCUS_MODE_AUTO); 
//params.setWhiteBalance(Parameters.WHITE_BALANCE_AUTO); 
params.setJpegQuality(100); 

camera.setParameters(params); 
ImageView overlay = (ImageView) findViewById(R.id.ImageView01); 
overlay.bringToFront(); 
} 
+0

感謝您的快速回答。請檢查我的onResume和我添加的logcat。它在cam = Camera.open();我不知道爲什麼... – 2013-02-20 10:48:46

+0

你在別的地方打開過相機嗎?如果否,請嘗試重新啓動您的設備。 native_setup中的連接錯誤通常是由未發佈的相機發生的。 – StarPinkER 2013-02-20 11:59:19

+0

你可以放一些更多的日誌,包括由CameraService等寫的日誌。 – StarPinkER 2013-02-20 12:00:59

0

你釋放它得很好,但在簡歷必須拋出空指針作爲相機對象爲null,請使用它,它會成爲像你那樣做的onCreate之前重新初始化。

相關問題