I have a simple Flashlight app which has a widget and it works fine for quite some time after an installation but then the widget stops responding, it just doesn't respond to a click and it doesn't throw any errors. I might've done some errors or irrational things in my code since I'm new to widgets but I can't seem to determine them and understand what causes the problem.
Here's my code:
public class MyAppWidget extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
Intent receiver = new Intent(context, MyAppWidgetReceiver.class);
receiver.setAction("COM_FLASHLIGHT");
receiver.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, receiver,0);
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.my_app_widget);
views.setOnClickPendingIntent(R.id.imageButton, pendingIntent);
appWidgetManager.updateAppWidget(appWidgetIds, views);
}
}
public class MyAppWidgetReceiver extends BroadcastReceiver {
public static boolean isActive = false;
public static Flash flash = new Flash();
@Override
public void onReceive(Context context, Intent intent) {
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.my_app_widget);
if(isActive){
isActive = false;
flash.off();
flash.close();
views.setImageViewResource(R.id.imageButton, R.drawable.pers_off);
}else{
isActive = true;
flash.open();
flash.on();
views.setImageViewResource(R.id.imageButton, R.drawable.pers_on);
}
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
appWidgetManager.updateAppWidget(new ComponentName(context, MyAppWidget.class), views);
}
}
And my Flash class, just in case:
public class Flash {
private Camera camera = null;
private Camera.Parameters cameraParameters;
private String previousFlashMode = null;
public synchronized void open() {
camera = Camera.open();
if (camera != null) {
cameraParameters = camera.getParameters();
previousFlashMode = cameraParameters.getFlashMode();
}
if (previousFlashMode == null) {
// could be null if no flash, i.e. emulator
previousFlashMode = Camera.Parameters.FLASH_MODE_OFF;
}
}
public synchronized void close() {
if (camera != null) {
cameraParameters.setFlashMode(previousFlashMode);
camera.setParameters(cameraParameters);
camera.release();
camera = null;
}
}
public synchronized void on() {
if (camera != null) {
cameraParameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
camera.setParameters(cameraParameters);
camera.startPreview();
}
}
public synchronized void off() {
if (camera != null) {
camera.stopPreview();
cameraParameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
camera.setParameters(cameraParameters);
}
}
public Camera getCamera(){
return camera;
}
}