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检测是否打开,没有打开,自动引导到设置页面
Android GPS检测是否打开,没有打开,自动引导到设置页面