我正在使用Widget开发Flashlight应用程序。当我打开手电筒时,Widget手电筒是打开的,当我启动一些应用程序时,手电筒会关闭。为什么会发生这种情况?为什么我的手电筒不能在后台运行?我该如何防止这种情况发生?我希望手电筒只能由用户关闭,而不是由系统关闭。
这是我的小部件代码:
@Override
public void onReceive(Context context, Intent intent) {
RemoteViews views = new RemoteViews(context.getPackageName(),
R.layout.widget_layout);
myPref = PreferenceManager.getDefaultSharedPreferences(context);
if (AppGlobals.getIsFlashOn()) {
views.setImageViewResource(R.id.flashlight_widget_imageview,
R.drawable.light_on);
} else {
views.setImageViewResource(R.id.flashlight_widget_imageview,
R.drawable.light_off);
}
AppWidgetManager appWidgetManager = AppWidgetManager
.getInstance(context);
appWidgetManager.updateAppWidget(new ComponentName(context,
FlashlightWidgetProvider.class), views);
if (AppGlobals.getIsFlashOn()) {
if (getmCameraWidget() != null) {
flashOffWidget();
}
if (Flashlight.getmCameraActivity() != null) {
flashOffApp();
Flashlight.flashlight_button
.setBackgroundResource(R.drawable.light_on);
}
Flashlight.turnMotorolaOff();
isLightOn = false;
NotifyFlashlight(context, isLightOn);
} else {
try {
setmCameraWidget(Camera.open());
} catch (Exception e) {
e.printStackTrace();
}
if (getmCameraWidget() == null) {
} else {
setParamsWidget(getmCameraWidget().getParameters());
List<String> flashModes = getParamsWidget()
.getSupportedFlashModes();
if (flashModes == null) {
return;
} else {
if (count == 0) {
getParamsWidget().setFlashMode(
Parameters.FLASH_MODE_OFF);
getmCameraWidget().setParameters(getParamsWidget());
getmCameraWidget().startPreview();
AppGlobals.setIsFlashOn(true);
}
String flashMode = getParamsWidget().getFlashMode();
if (!Parameters.FLASH_MODE_TORCH.equals(flashMode)) {
if (flashModes.contains(Parameters.FLASH_MODE_TORCH)) {
getParamsWidget().setFlashMode(
Parameters.FLASH_MODE_TORCH);
getmCameraWidget().setParameters(getParamsWidget());
} else {
getParamsWidget().setFlashMode(
Parameters.FLASH_MODE_ON);
getmCameraWidget().setParameters(getParamsWidget());
try {
getmCameraWidget().autoFocus(
new AutoFocusCallback() {
public void onAutoFocus(
boolean success,
Camera camera) {
count = 1;
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
AppGlobals.setIsFlashOn(true);
isLightOn = true;
NotifyFlashlight(context, isLightOn);
}
}
}
Flashlight.turnMotorolaOn();
}
}
private void flashOffApp() {
Flashlight.getmCameraActivity().stopPreview();
Flashlight.getmCameraActivity().release();
Flashlight.setmCameraActivity(null);
AppGlobals.setIsFlashOn(true);
count = 0;
}
private void flashOffWidget() {
FlashlightWidgetReceiver.getmCameraWidget().stopPreview();
FlashlightWidgetReceiver.getmCameraWidget().release();
FlashlightWidgetReceiver.setmCameraWidget(null);
AppGlobals.setIsFlashOn(false);
count = 0;
}
public static Camera getmCameraWidget() {
return mCameraWidget;
}
public static void setmCameraWidget(Camera mCameraWidget) {
FlashlightWidgetReceiver.mCameraWidget = mCameraWidget;
}
public static Parameters getParamsWidget() {
return paramsWidget;
}
public static void setParamsWidget(Parameters paramsWidgetSet) {
paramsWidget = paramsWidgetSet;
}
}
}
以下是在后台运行Falsh的完整代码。将代码放入服务中所需的一切。然后从你的主要活动开始你的服务。
这是服务类别:
public class ServiceFlash extends Service {
private boolean isFlashOn = false;
private Camera camera;
Context context ;
PackageManager pm;
@Override
public void onCreate() {
// TODO Auto-generated method stub
context = getApplicationContext();
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
pm = context.getPackageManager();
if (!pm.hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
Log.e("err", "Device has no camera!");
Toast.makeText(getApplicationContext(),
"Your device doesn't have camera!", Toast.LENGTH_SHORT)
.show();
return 0;
}
camera = Camera.open();
final Parameters p = camera.getParameters();
// turn flash on
if (isFlashOn) {
Log.i("info", "torch is turned off!");
p.setFlashMode(Parameters.FLASH_MODE_OFF);
camera.setParameters(p);
isFlashOn = false;
} else {
Log.i("info", "torch is turned on!");
p.setFlashMode(Parameters.FLASH_MODE_TORCH);
camera.setParameters(p);
isFlashOn = true;
}
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
别忘了把这个添加到你的清单中:
<service
android:name=".ServiceFlash"
android:exported="false"/>
你的活动可能是这样的:公共类AppActivity扩展Activity{private布尔值isFlashOn=false;私人摄像机;私人按钮;
@Override
protected void onStop() {
super.onStop();
if (camera != null) {
camera.release();
}
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Intent front_translucent = new Intent(this, ServiceFlash.class);
startService(front_translucent);
}
}
你可以从这样的小部件类启动你的服务(试着把这个代码放在小部件类的onReceive方法中):
// Create intent
Intent serviceIntent = new Intent(context, mService.class);
// start service
context.startService(serviceIntent);
享受。。!