我的手电筒应用程序在进入主屏幕时不断崩溃

时间:2014-02-02 14:32:23

标签: android camera flashlight

我的手电筒应用程序在打开灯光并进入主屏幕时仍然会崩溃,或者使用后退按钮,甚至当我打开屏幕时,它也不会立即崩溃;当我回到应用程序时,我按下按钮关闭/打开灯,它会与这些原木猫一起崩溃;

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();

}

}

3 个答案:

答案 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设备上随机崩溃一样,这是其中一个时间,因为它现在有效,我没有对代码进行任何更改。