ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

启动其他应用程序时手电筒关闭. Android的

2019-10-11 05:26:10  阅读:264  来源: 互联网

标签:android background flashlight


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

}

您可以从这样的小部件类启动服务(尝试将代码放入小部件类的onReceive方法中):

 // Create intent 
    Intent serviceIntent = new Intent(context, mService.class);
// start service 
context.startService(serviceIntent);

请享用..!

标签:android,background,flashlight
来源: https://codeday.me/bug/20191011/1890492.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有