2013-02-20 82 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之前重新初始化。

相关问题