当其他应用程序启动时,闪光灯熄灭.安卓



我正在使用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);

享受。。!

最新更新