关于android:检查位置提供者状态

Check Location Provider Status

我正在制作一个测试项目来学习如何在 Android 中使用 Location。

我想使用 WIFI/3G 作为默认提供程序,但是如果没有工作(例如,飞行模式设置为 ON),我想切换到 GPS。

我的想法是检查 NETWORK_PROVIDER 状态。如果不可用,请检查 GPS_PROVIDER 状态。如果这也不可用,请不要使用位置并显示消息。

为此,我需要检查当前的提供者状态,但我找不到方法。
有什么办法吗?

我曾尝试使用 isProviderEnabled,但该方法只告诉我 Provider 是否可以使用,但如果真的启用则不会。

理想的想法是在调用 requestLocationUpdates

之前这样做

感谢和抱歉我的英语


使用此代码检查

1
2
3
4
5
 LocationManager mlocMan = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
if(!mlocMan .isProviderEnabled(LocationManager.GPS_PROVIDER) && !mlocMan .isProviderEnabled(LocationManager.NETWORK_PROVIDER)){

//both providers are disabled, show a message...
}

编辑:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//--------------------------------------------------------
private static boolean isAirplaneModeOn(Context context) {

   return Settings.System.getInt(context.getContentResolver(),
           Settings.System.AIRPLANE_MODE_ON, 0) != 0;

}

public void onCreate(){
// .. some code

LocationManager mlocMan = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

if(!isAirplaneModeOn(this)){//airplan is OFF, check Providers

if(mlocMan.isProviderEnabled(LocationManager.NETWORK_PROVIDER){
//start listener to requestUpdates ...
}else{
//NETWORK_PROVIDER disabled, try GPS
if(mlocMan .isProviderEnabled(LocationManager.GPS_PROVIDER)){
//start listener to requestUpdates ...
}else{
//show message, no providers enabled.
}

}//network disabled

}else{//airplan mode is ON
//here you need to check GPS only, as netwrok is OFF for sure
if(mlocMan .isProviderEnabled(LocationManager.GPS_PROVIDER)){
//start listener to requestUpdates ...
}else{
//show message, no providers enabled.
}

}//airplan is ON

}//onCreate()

可能有一些语法错误,但我认为这个逻辑是你需要的。


我正准备在我的一个应用程序中进行设置,但我还没有尝试过。如果您使用对 LocationManager::requestLocationUpdates() 的调用注册 LocationListener,则框架应调用 LocationListener 的 onStatusChanged(String provider, int status, Bundle extras) 并提供状态。状态应该是 AVAILABLE、OUT_OF_SERVICE 或 TEMPORARILY_UNAVAILABLE。

理论上,当用户切换到飞行模式时,您应该会收到状态为 OUT_OF_SERVICE 或 TEMPORARILY_UNAVAILABLE 的 onStatusChanged 调用。然后,您可以切换到使用其他提供商。关闭飞行模式后,您应该会再次收到状态为 AVAILABLE 的呼叫,并且您可以恢复使用之前的提供商。

位置监听器参考:
https://developer.android.com/reference/android/location/LocationListener