Android: detect when GPS is turned on/off (or when no app is using it anymore)

前端 未结 4 1483
太阳男子
太阳男子 2021-02-13 02:24

I\'m on Android 2.3.7 and I\'m trying to write a BroadcastReceiver that will get called when the user turns GPS on/off (ie: by tapping on the \"use GPS satellites\" in the optio

相关标签:
4条回答
  • 2021-02-13 02:38

    Starting from API 19 you can listen for the intent action LocationManager.MODE_CHANGED_ACTION.

    You can also get the current location mode as follows:

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

    The value returned should be one of these:

    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
    
    0 讨论(0)
  • 2021-02-13 02:39

    On API level 9 and higher you can use LocationManager.PROVIDERS_CHANGED_ACTION:

    Broadcast intent action when the configured location providers change. For use with isProviderEnabled(String). If you're interacting with the LOCATION_MODE API, use MODE_CHANGED_ACTION instead.

    Constant Value: "android.location.PROVIDERS_CHANGED"

    Source

    0 讨论(0)
  • 2021-02-13 02:44

    The following solution might be a weird solution but you can try it if you don't find any solution. Another problem with your solution is it works only after api level 9.

    in a thread or service you can check the gps status periodically with a very short interval by using

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

    it will use the permission

    android.permission.ACCESS_FINE_LOCATION
    

    Even though I am answering this, to me it should not be a good solution. Also there is a chance of minimum period interval delay. Just an option.

    0 讨论(0)
  • 2021-02-13 02:55

    Use a LocationListener and override OnStatusChanged.

    You can attach your listener using the requestLocationUpdates(String, long, float, LocationListener) method on your LocationManager instance.

    0 讨论(0)
提交回复
热议问题