[英]Android app crashed when closing app using wakelock.release()
I have a simple flash light app that works well but when the user closes the app the app crashes. 我有一个简单的闪光灯应用程序运行良好,但当用户关闭应用程序时,应用程序崩溃。 I presume the problem is with the wakelock.
我认为问题出在唤醒锁上。
When the flash is on the the wakelock is turned on, when the flash is turned off the wakelock is turned off. 当闪光灯打开时,唤醒锁被打开,当闪光灯关闭时,唤醒锁被关闭。 This works fine but as soon as the user presses back or home the app crashes.
这工作正常,但一旦用户按下或回家应用程序崩溃。
My Log data: 我的日志数据:
10-24 09:52:45.235: E/AndroidRuntime(6614): Process: r1d.org.uk.flashlight, PID: 6614 10-24 09:52:45.235: E/AndroidRuntime(6614): java.lang.RuntimeException: Unable to destroy activity {r1d.org.uk.flashlight/r1d.org.uk.flashlight.MainActivity}: java.lang.RuntimeException: WakeLock under-locked MyWakelockTag 10-24 09:52:45.235: E/AndroidRuntime(6614): at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3812)
10-24 09:52:45.235:E / AndroidRuntime(6614):进程:r1d.org.uk.flashlight,PID:6614 10-24 09:52:45.235:E / AndroidRuntime(6614):java.lang.RuntimeException :无法销毁活动{r1d.org.uk.flashlight / r1d.org.uk.flashlight.MainActivity}:java.lang.RuntimeException:WakeLock欠锁MyWakelockTag 10-24 09:52:45.235:E / AndroidRuntime(6614) ):在android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3812)
MainActivity: 主要活动:
public class MainActivity extends Activity {
private ImageView lightToggle;
private ImageButton lightSwitch;
Camera camera = null;
Parameters parameters;
Boolean isOn = false;
int lightON = R.drawable.on;
int lightOFF = R.drawable.off;
int switchON = R.drawable.switch_on;
int switchOFF = R.drawable.switch_off;
Boolean hasFlash;
PowerManager powerManager;
PowerManager.WakeLock wakeLock;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AdManager ads = new AdManager(this);
lightToggle = (ImageView) findViewById(R.id.lightOn);
lightSwitch = (ImageButton) findViewById(R.id.lightSwitch);
Context context = this;
hasFlash = context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
powerManager = (PowerManager) getSystemService(POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelockTag");
if(!hasFlash){
ContextThemeWrapper themedContext;
if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ) {
themedContext = new ContextThemeWrapper( MainActivity.this, android.R.style.Theme_Holo_Light_Dialog_NoActionBar );
}
else {
themedContext = new ContextThemeWrapper( MainActivity.this, android.R.style.Theme_Light_NoTitleBar );
}
AlertDialog.Builder builder = new AlertDialog.Builder(themedContext);
builder.setTitle(getResources().getString(R.string.notsupported))
.setMessage(getResources().getString(R.string.notsupportedinfo))
.setIcon(android.R.drawable.ic_dialog_alert)
.setNegativeButton(getResources().getString(R.string.ok), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int i) {
dialog.cancel();
}
});
builder.show();
}
turnOn();
lightSwitch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(isOn){
turnOff();
} else {
turnOn();
}
}
});
}
private void turnOn(){
lightToggle.setImageDrawable(getResources().getDrawable(lightON));
lightSwitch.setImageDrawable(getResources().getDrawable(switchON));
wakeLock.acquire();
if(hasFlash) {
camera = Camera.open();
parameters = camera.getParameters();
parameters.setFlashMode(Parameters.FLASH_MODE_TORCH); //FLASH_MODE_ON
camera.setParameters(parameters);
}
isOn = true;
}
private void turnOff(){
lightToggle.setImageDrawable(getResources().getDrawable(lightOFF));
lightSwitch.setImageDrawable(getResources().getDrawable(switchOFF));
wakeLock.release();
if(hasFlash) {
parameters.setFlashMode(Parameters.FLASH_MODE_OFF);
camera.setParameters(parameters);
camera.release();
camera = null;
}
isOn = false;
}
@Override
public void onDestroy() {
turnOff();
super.onDestroy();
}
@Override
public void onPause(){
turnOff();
super.onPause();
}
@Override
public void onResume(){
turnOn();
super.onResume();
}
}
In onDestroy
you're trying to release a wakelock which you already released in onPause
. 在
onDestroy
你试图发布一个已经在onPause
发布的唤醒锁。 This should work: 这应该工作:
if (wakeLock.isHeld()) {
wakeLock.release();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.