java– 怎么样?侦听位置设置被打开(Android App)

java– 怎么样?侦听位置设置被打开(Android App),第1张

概述所以我花了几个星期的时间在我的Android应用程序上工作,并研究实现我需要做的最好的方式,但仍然无法正确完成..任何/所有帮助都非常感谢,因为我仍然掌握着一切……任务:(假设“位置”/GPS设置当前已关闭),我需要让我的应用程序一直在监听“位置”设置是否打开..此时,只需启动一个

所以我花了几个星期的时间在我的Android应用程序上工作,并研究实现我需要做的最好的方式,但仍然无法正确完成..任何/所有帮助都非常感谢,因为我仍然掌握着一切……

任务:

(假设“位置”/ GPS设置当前已关闭),我需要让我的应用程序一直在监听“位置”设置是否打开..此时,只需启动一个活动.

思路:

这些是我认为可能有用的不同方式:

>使用“onProvIDerEnabled”的LocationListener
>使用“onGpsstatusChanged”和“GPS_EVENT_STARTED”的GpsstatusListener
> GpsProvIDer需要卫星(以确定它是否启动),或以某种方式使用GpsProvIDer的“AVAILABLE”Constant / int
>使用“ACTION_SERVICE_INTENT”(和/或)“ACTION_INJECTED_SETTING_CHANGED”与“onGetEnabled”或“isEnabled”的SettingInjectorService
> Settings.Secure使用“LOCATION_MODE”!=“LOCATION_MODE_OFF”
>一个ContentObserver / ContentResolver
>意图getAction(…)
>某种“if / else”

问题:

任何以下任何问题的建议或答案都非常感谢..

>上述哪些想法是完成任务的最佳方式?越简单越好,但最重要的是它需要一直监听,并在打开位置设置时立即响应.
>对于上述哪个创意效果最好,我将如何实施? (例如,我需要一个broadcastListener?还是一个服务?它将如何组合在一起?

我非常感谢你能给我的任何建议或帮助..我仍然掌握所有这一切,但有足够的信心去做,并渴望发布我的第一个应用程序..所以谢谢你,这意味着很多并将极大地帮助我.

编辑:

好的,这就是我到目前为止所得到的……

继承人我的接管人:

MyReceiver.Java

public class MyReceiver extends broadcastReceiver {    private final static String TAG = "LocationProvIDerChanged";    boolean isGpsEnabled;    boolean isNetworkEnabled;    public MyReceiver() {    // EMPTY    // MyReceiver Close Bracket    }    // START OF onReceive    @OverrIDe    public voID onReceive(Context context, Intent intent) {        // PRIMARY RECEIVER        if (intent.getAction().matches("androID.location.PROVIDERS_CHANGED")) {            Log.i(TAG, "Location ProvIDers Changed");            LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);            isGpsEnabled = locationManager.isProvIDerEnabled(LocationManager.GPS_PROVIDER);            isNetworkEnabled = locationManager.isProvIDerEnabled(LocationManager.NETWORK_PROVIDER);            Toast.makeText(context, "GPS Enabled: " + isGpsEnabled + " Network Location Enabled: " + isNetworkEnabled, Toast.LENGTH_LONG).show();            // START DIALOG ACTIVITY            if (isGpsEnabled || isNetworkEnabled) {                Intent runDialogActivity = new Intent(context, DialogActivity.class);                context.startActivity(runDialogActivity);            }        }        // BOOT COMPLETED (REPliCA OF PRIMARY RECEIVER CODE FOR WHEN BOOT_COMPLETED)        if (intent.getAction().matches("androID.intent.action.BOOT_COMPLETED")) {            Log.i(TAG, "Location ProvIDers Changed Boot");            LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);            isGpsEnabled = locationManager.isProvIDerEnabled(LocationManager.GPS_PROVIDER);            isNetworkEnabled = locationManager.isProvIDerEnabled(LocationManager.NETWORK_PROVIDER);            Toast.makeText(context, "GPS Enabled Boot: " + isGpsEnabled + " Network Location Enabled Boot: " + isNetworkEnabled, Toast.LENGTH_LONG).show();            // START DIALOG ACTIVITY            if (isGpsEnabled || isNetworkEnabled) {                Intent runDialogActivity = new Intent(context, DialogActivity.class);                context.startActivity(runDialogActivity);            }        }    // onReceive CLOSE BRACKET    }// CLOSE OF FulL CLASS}

而且这是Manifest的样子:

的manifest.xml

<?xml version="1.0" enCoding="utf-8"?><manifest xmlns:androID="http://schemas.androID.com/apk/res/androID"    package="com.ender.projects.receivertest">    <uses-permission androID:name="androID.permission.ACCESS_FINE_LOCATION" />    <uses-permission androID:name="androID.permission.RECEIVE_BOOT_COMPLETED" />    <application        androID:allowBackup="true"        androID:fullBackupContent="true"        androID:icon="@mipmap/ic_launcher"        androID:label="@string/app_name"        androID:theme="@style/Apptheme">        <activity androID:name=".MainActivity">            <intent-filter>                <action androID:name="androID.intent.action.MAIN" />                <category androID:name="androID.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <activity androID:name=".DialogActivity">        </activity>        <receiver            androID:name=".MyReceiver"            androID:enabled="true"            androID:exported="true">            <intent-filter>                <action androID:name="androID.location.PROVIDERS_CHANGED" />                <action androID:name="androID.intent.action.BOOT_COMPLETED" />                <category androID:name="androID.intent.category.DEFAulT" />            </intent-filter>        </receiver>    </application></manifest>

除了这些文件,我还有以下文件:
MainActivity.Java和DialogActivity.Java,都带有布局文件,
activity_main.xml和activity_dialog.xml与它们匹配.

因此,如果我理解正确,当用户下载应用程序并打开它时,我的MainActivity.Java和相应的布局将启动.但我只是将其用作首选屏幕.因此,一旦他们第一次打开应用程序,广播接收器应该自动开始侦听LOCATION设置是否打开,是否正确?我还希望广播监听器保持监听,即使它收到初始广播后(如果他们关闭LOCATION设置我的onReceive仍会触发,然后再将它们再次打开..)

那么(A)到目前为止我的代码看起来如何?
(B)要完成我刚才描述的内容,需要添加什么?
和(C)当我将LOCATION设置为ON时,运行它会抛出此错误.
..我该怎么办呢?:
java.lang.RuntimeException:无法启动接收器com.bryce.projects.servicesthreadsetc.MyReceiver:androID.util.AndroIDRuntimeException:从Activity上下文外部调用startActivity()需要FLAG_ACTIVITY_NEW_TASK标志.这真的是你想要的吗?

再次感谢您的帮助!

解决方法:

由于您不需要实际获取位置,因此您需要的最佳实现是broadcastReceiver.

这是最好的选择,因为您不需要一直运行服务(导致额外的电池消耗),并且您将能够从broadcastReceiver启动您的活动.

使用intent过滤器和broadcastReceiver,只要位置设置已更改(启用或禁用), *** 作系统就会启动您的应用程序,如果已启用,则可以从broadcastReceiver启动活动.

首先添加intent过滤器,当 *** 作系统发出设置已更改的隐式Intent时将捕获该过滤器:

<receiver    androID:name=".LocationProvIDerChangedReceiver"    androID:exported="false" >    <intent-filter>        <action androID:name="androID.location.PROVIDERS_CHANGED" />        <category androID:name="androID.intent.category.DEFAulT" />    </intent-filter></receiver>

然后,在LocationProvIDerChangedReceiver.java中,您的实现将是这样的:

import androID.content.broadcastReceiver;import androID.content.Context;import androID.content.Intent;import androID.location.LocationManager;import androID.util.Log;import androID.Widget.Toast;public class LocationProvIDerChangedReceiver extends broadcastReceiver {    private final static String TAG = "LocationProvIDerChanged";    boolean isGpsEnabled;    boolean isNetworkEnabled;    @OverrIDe    public voID onReceive(Context context, Intent intent) {        if (intent.getAction().matches("androID.location.PROVIDERS_CHANGED"))        {            Log.i(TAG, "Location ProvIDers changed");            LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);            isGpsEnabled = locationManager.isProvIDerEnabled(LocationManager.GPS_PROVIDER);            isNetworkEnabled = locationManager.isProvIDerEnabled(LocationManager.NETWORK_PROVIDER);            //Start your Activity if location was enabled:            if (isGpsEnabled || isNetworkEnabled) {                  Intent i = new Intent(context, YourActivity.class);                  context.startActivity(i);            }        }    }}
总结

以上是内存溢出为你收集整理的java – 怎么样?侦听位置设置被打开(Android App)全部内容,希望文章能够帮你解决java – 怎么样?侦听位置设置被打开(Android App)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1120294.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存