Android:检测 GPS 何时打开/关闭(或当没有应用程序不再使用它时)

Posted

技术标签:

【中文标题】Android:检测 GPS 何时打开/关闭(或当没有应用程序不再使用它时)【英文标题】:Android: detect when GPS is turned on/off (or when no app is using it anymore) 【发布时间】:2013-03-05 07:53:56 【问题描述】:

我使用的是 android 2.3.7,我正在尝试编写一个 BroadcastReceiver,当用户打开/关闭 GPS 时会调用它(即:通过点击选项中的“使用 GPS 卫星”。

到目前为止我所做的是:

1) 创建了以下广播接收器:

public class GPSStatusBroadcastReceiver extends BroadcastReceiver 

    @Override
    public void onReceive(Context arg0, Intent arg1) 
        Toast.makeText(arg0, "Broadcast received!", Toast.LENGTH_SHORT).show();

    

2) 将此添加到 android 清单中的标签内:

<receiver android:name=".GPSStatusBroadcastReceiver"> 
    <intent-filter> 
        <action android:name="android.location.PROVIDERS_CHANGED" /> 
    </intent-filter> 
</receiver>

现在的问题是它似乎不可靠。当我打开/关闭 GPS 时,onReceive() 方法有时只运行(我会说 1 次超时 3),其他时候它不会被调用。

我想知道是否有可靠的方法来检测 GPS 何时关闭/开启。

如果没有,最好至少在没有应用程序使用 GPS 时收到通知(即:当 gps 图标从状态栏中消失时,表示没有人在主动定位)。

编辑:澄清:我不想在我的应用程序运行时执行此操作。我只是在打开/关闭 gps 时启动我的应用程序,执行它的操作然后终止,我不想订阅 LocationsUpdates...

【问题讨论】:

【参考方案1】:

在 API 级别 9 及更高级别上,您可以使用 LocationManager.PROVIDERS_CHANGED_ACTION

配置的位置提供程序更改时的广播意图操作。用于isProviderEnabled(String)。如果您正在与LOCATION_MODE API 交互,请改用MODE_CHANGED_ACTION

常量值:“android.location.PROVIDERS_CHANGED”

Source

【讨论】:

【参考方案2】:

以下解决方案可能是一个奇怪的解决方案,但如果您没有找到任何解决方案,您可以尝试一下。您的解决方案的另一个问题是它仅在 api 级别 9 之后才有效。

在线程或服务中,您可以通过使用以非常短的间隔定期检查 gps 状态

 LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE );
 boolean statusOfGPS = manager.isProviderEnabled(LocationManager.GPS_PROVIDER);

它会使用权限

android.permission.ACCESS_FINE_LOCATION

即使我正在回答这个问题,对我来说这也不应该是一个好的解决方案。也有最小周期间隔延迟的机会。只是一种选择。

【讨论】:

与 poitroae 的回答一样:如果我使用它,这是否意味着我的应用程序必须运行?我不想要那个。我希望我的应用程序仅在 gps 打开/关闭时启动,运行一个方法然后终止。我的印象是你必须使用 BroadcastReceivers 来做到这一点,我错了吗? 不,你是完全正确的。我理解这一点是错误的。我的错 我的错,我的问题有点笼统,我现在补充说明。【参考方案3】:

从 API 19 开始,您可以侦听意图操作 LocationManager.MODE_CHANGED_ACTION

还可以通过如下方式获取当前位置模式:

try

    int locationMode = android.provider.Settings.Secure.getInt(context.getContentResolver(), android.provider.Settings.Secure.LOCATION_MODE);
 catch (android.provider.Settings.SettingNotFoundException e)

    e.printStackTrace();

返回的值应该是以下之一:

android.provider.Settings.Secure.LOCATION_MODE_BATTERY_SAVING
android.provider.Settings.Secure.LOCATION_MODE_HIGH_ACCURACY
android.provider.Settings.Secure.LOCATION_MODE_OFF
android.provider.Settings.Secure.LOCATION_MODE_SENSORS_ONLY

【讨论】:

此常量在 API 级别 28 中已弃用。检查位置模式和侦听更改的首选方法是通过 LocationManager#isLocationEnabled() 来源:developer.android.com/reference/android/provider/…【参考方案4】:

使用LocationListener 并覆盖OnStatusChanged

您可以在您的 LocationManager 实例上使用 requestLocationUpdates(String, long, float, LocationListener) 方法附加您的侦听器。

【讨论】:

抱歉,我的问题不够清楚。我不想在我的应用中检测位置。我想要做的只是检测用户系统范围内何时打开/关闭 GPS。 (我的应用程序只是这个广播接收器,它会在每次打开/关闭 GPS 时简单地将一些数据写入磁盘) @Master_T 是,如果OnStatusChanged 在状态发生变化时被触发。当用户启用/禁用它时,状态显然会发生变化。 但是要让它工作,我的应用程序是否必须处于活动状态?或者至少在后台运行?我想要的是,只要打开/关闭 GPS,我的应用程序就会被调用,执行它的操作然后终止。这就是我使用 BroadcasReceiver 的原因,因为它会通知应用程序,即使它们没有运行。

以上是关于Android:检测 GPS 何时打开/关闭(或当没有应用程序不再使用它时)的主要内容,如果未能解决你的问题,请参考以下文章

检测 Android 手机中的 GPS 开/关开关

您如何检测 iBeacon 发射器何时关闭?安卓

Android GPS检测是否打开,没有打开,自动引导到设置页面

Android GPS检测是否打开,没有打开,自动引导到设置页面

Android GPS检测是否打开,没有打开,自动引导到设置页面

Android - 以编程方式打开或关闭 GPS