我的手电筒应用程序在打开灯光并进入主屏幕时仍然会崩溃,或者使用后退按钮,甚至当我打开屏幕时,它也不会立即崩溃;当我回到应用程序时,我按下按钮关闭/打开灯,它会与这些原木猫一起崩溃;
01-31 09:26:07.094: E/AndroidRuntime(16941): FATAL EXCEPTION: main
01-31 09:26:07.094: E/AndroidRuntime(16941): java.lang.RuntimeException: Method called after release()
01-31 09:26:07.094: E/AndroidRuntime(16941): at android.hardware.Camera.native_setParameters(Native Method)
01-31 09:26:07.094: E/AndroidRuntime(16941): at android.hardware.Camera.setParameters(Camera.java:1492)
01-31 09:26:07.094: E/AndroidRuntime(16941): at de.vogella.android.notificationmanager.NotificationReceiverActivity.onClick(NotificationReceiverActivity.java:67)
01-31 09:26:07.094: E/AndroidRuntime(16941): at android.view.View.performClick(View.java:4192)
01-31 09:26:07.094: E/AndroidRuntime(16941): at android.view.View$PerformClick.run(View.java:17254)
01-31 09:26:07.094: E/AndroidRuntime(16941): at android.os.Handler.handleCallback(Handler.java:615)
01-31 09:26:07.094: E/AndroidRuntime(16941): at android.os.Handler.dispatchMessage(Handler.java:92)
01-31 09:26:07.094: E/AndroidRuntime(16941): at android.os.Looper.loop(Looper.java:137)
01-31 09:26:07.094: E/AndroidRuntime(16941): at android.app.ActivityThread.main(ActivityThread.java:4950)
01-31 09:26:07.094: E/AndroidRuntime(16941): at java.lang.reflect.Method.invokeNative(Native Method)
01-31 09:26:07.094: E/AndroidRuntime(16941): at java.lang.reflect.Method.invoke(Method.java:511)
01-31 09:26:07.094: E/AndroidRuntime(16941): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004)
01-31 09:26:07.094: E/AndroidRuntime(16941): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771)
01-31 09:26:07.094: E/AndroidRuntime(16941): at dalvik.system.NativeStart.main(Native Method)
这些是我的方法;
public void onClick(View v) {
// TODO Auto-generated method stub
if (camOn == false) {
cam = Camera.open();
para = cam.getParameters();
para.setFlashMode(Parameters.FLASH_MODE_TORCH);
cam.setParameters(para);
Log.i(CLASSNAME, "AA1 "+camOn);
camOn = true;
Log.i(CLASSNAME, "AA2 "+camOn);
}
else {
para.setFlashMode(Parameters.FLASH_MODE_OFF);
cam.setParameters(para);
cam.release();
//cam = null;
Log.i(CLASSNAME, "BB1 "+camOn);
camOn = false;
Log.i(CLASSNAME, "BB2 "+camOn);
}
}
@Override
protected void onPause() {
super.onPause();
// TODO Auto-generated method stub
cam.release();
// cam=cam;
// finish();*/
}
@Override
protected void onStop() {
super.onStop();
cam.release();
}
@Override
protected void onDestroy() {
super.onDestroy();
cam.release();
}
protected void onResume() {
super.onResume();
}
}
答案 0 :(得分:1)
您正在从onStop(),onPause()和onDestroy()中调用cam.release(),因此当您的应用程序被销毁时,将调用cam.release()三次。这至多是不必要的,最糟糕的是,可能会导致崩溃。
我建议从onResume()调用Camera.open() ,从onPause()调用cam.release() 。删除所有其他Camera.open()和release()调用。
您应该仔细研究activity lifecycle documentation。
答案 1 :(得分:0)
正如马丁斯通指出的那样,你对cam.close / open的调用是草率的。我相信,真正的问题是你永远不会在onResume中调用cam.open。
关闭应用程序不是问题。它只是在恢复时不再具有所需的资源。
答案 2 :(得分:0)
我认为这只是一个问题,就像任何其他应用程序在Android设备上随机崩溃一样,这是其中一个时间,因为它现在有效,我没有对代码进行任何更改。