16

我在 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 ...

4

4 回答 4

9

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

当配置的位置提供者改变时广播意图动作。与isProviderEnabled(String). 如果您正在与 交互LOCATION_MODE API,请MODE_CHANGED_ACTION改用。

常数值:“android.location.PROVIDERS_CHANGED”

资源

于 2014-02-12T05:30:23.540 回答
3

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

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

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

它将使用权限

android.permission.ACCESS_FINE_LOCATION

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

于 2013-03-16T17:42:15.010 回答
2

从 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
于 2016-09-13T14:09:53.317 回答
-3

使用 aLocationListener并覆盖OnStatusChanged

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

于 2013-03-16T17:06:13.753 回答