2014-02-02 2 views
0

Мое приложение для фонарика продолжает сбой при включении света и переходе на рабочий экран, или с помощью кнопки «Назад», или даже когда я включаю экран, он не сработает сразу ; когда я вернусь в приложение, я нажимаю кнопку, чтобы выключить/включить свет, и он падает с этими лог-котами;Приложение для фонарика продолжает сбой при работе на домашнем экране

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

Я думаю, что это была просто проблема, как любое другое приложение, случайным образом сбой на устройстве Android, это был один из тех случаев, поскольку он работает сейчас, и я не внес никаких изменений в код.

+0

На самом деле, когда у меня был свет, и я закрыл приложение, он разбился, и все было в порядке, так что я сделал, реализую open() внутри onResume(), но внутри на клике, если (camOn == false) {я сначала закрыть его, а затем открыть его снова, где он только что открыл; if (camOn == false) { \t cam.release(); cam = Camera.open(); –

1

Вы звоните cam.release() от всех OnStop(), OnPause() и OnDestroy(), так cam.release() будет вызываться три раза, когда ваше приложение будет уничтожен. Это в лучшем случае не нужно и, в худшем случае, может привести к сбоям.

Я предлагаю вызова Camera.open() только из onResume() и cam.release() только из OnPause(). Удалите все другие вызовы Camera.open() и release().

Вы должны тщательно изучить activity lifecycle documentation.

0

Как указал Мартин Стоун, ваши вызовы cam.close/open неаккуратные. Я считаю, что реальная проблема заключается в том, что вы никогда не называете cam.open in onResume.

Закрытие приложения не является проблемой. Это просто, что у него больше нет необходимых ресурсов при возобновлении.

+0

Как показывает эта страница Android dev (http://developer.android.com/reference/android/hardware/Camera.html), «Важно: Вызов release(), чтобы освободить камеру для использования другими приложениями. должен немедленно отпустить камеру в onPause() (и снова открыть() в onResume()). " –

Смежные вопросы