【问题标题】:Android: detect when GPS is turned on/off (or when no app is using it anymore)Android:检测 GPS 何时打开/关闭(或当没有应用程序不再使用它时)
【发布时间】: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...

【问题讨论】:

    标签: android gps broadcastreceiver


    【解决方案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
      

      【讨论】:

      【解决方案4】:

      使用LocationListener 并覆盖OnStatusChanged

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

      【讨论】:

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