手电筒在启动其他应用程序时会关闭。Android

3
我正在开发一个带小部件的手电筒应用程序。 当我通过小部件打开手电筒时,手电筒会亮起,但当我启动某些应用程序时,手电筒就会关闭。 这是为什么?为什么我的手电筒不能在后台运行? 如何防止这种情况发生?我希望手电筒只能由用户关闭,而不是系统自动关闭。
以下是我的小部件代码:
    @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;
    }


    }
}

这个想法怎么样:将打开/关闭闪光灯的代码逻辑移动到一个服务中。我不确定它是否有帮助,因为我没有测试过。 - Goran Horia Mihail
@GoranHoriaMihail 那我该怎么做呢?我从未使用过服务,所以对它们不是很了解,但从我在Android文档中读到的内容来看,这可能是一个解决方案。如果您愿意写出答案并且它有效,我打算在2小时后对此问题进行悬赏,当然会给予奖励。 - user3231871
1个回答

1
这里是在后台运行Flash的完整代码。您只需要将代码放入服务中,然后从主活动启动服务即可。
以下是服务类:
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"/>

您的活动可能像这样: public class AppActivity extends Activity { private boolean isFlashOn = false; private Camera camera; private Button button;
@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);

Enjoy..!


告诉我是否有任何问题。 - Ibrahim AbdelGawad
实际上我创建了一个服务Activity,今天自己做了一些研究,但是我无法调用startService和stopService方法,因为它在小部件中不受支持(根据SO上的一些答案)。 - user3231871
太好了!愉快地编程吧,如果这篇回答对你有帮助,请接受或投票支持我。 - Ibrahim AbdelGawad
嗯,我想你没有理解我的意思。我已经创建了服务,但我不知道如何在小部件类中启动该服务。在更新时。 - user3231871
好的,就是这样。谢谢。 - user3231871

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接