Android:检测GPS开启/关闭时(或者当没有应用程序正在使用它时)

时间:2013-03-16 17:04:39

标签: android gps broadcastreceiver

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

到目前为止,我所做的是:

1)创建了以下broadcastReceiver:

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 / ff时onReceive()方法有时只运行(我会说1次超时3),其他时候它不会被调用。

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

如果不存在,至少在没有应用程序使用GPS时会收到通知会很高兴(例如:当gps图标从状态栏中消失时,表示没有人正在主动定位)。

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

4 个答案:

答案 0 :(得分:9)

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

  

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

     

常量值:“android.location.PROVIDERS_CHANGED”

Source

答案 1 :(得分:3)

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

在线程或服务中,您可以使用

定期检查gps状态,间隔很短
 LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE );
 boolean statusOfGPS = manager.isProviderEnabled(LocationManager.GPS_PROVIDER);

它将使用权限

android.permission.ACCESS_FINE_LOCATION

即使我在回答这个问题,但对我来说这不应该是一个好的解决方案。还有可能存在最小周期间隔延迟。只是一个选择。

答案 2 :(得分: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

答案 3 :(得分:-3)

使用LocationListener并覆盖OnStatusChanged

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