我正在使用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;
}
}
}
答案 0 :(得分:1)
以下是在后台运行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 boolean 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);
}
}
你可以像这样从widget类开始你的服务(尝试把这个代码放在widget类的onReceive方法中):
// Create intent
Intent serviceIntent = new Intent(context, mService.class);
// start service
context.startService(serviceIntent);
享受..!