如何在 API 18 及以下版本中检查位置是不是已开启并处于高优先级
Posted
技术标签:
【中文标题】如何在 API 18 及以下版本中检查位置是不是已开启并处于高优先级【英文标题】:How to check if location is on and in high priority on API 18 and below如何在 API 18 及以下版本中检查位置是否已开启并处于高优先级 【发布时间】:2015-07-01 01:50:20 【问题描述】:试过这个:
String locationProviders = Settings.Secure.getString(getActivity().getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
Log.d(TAG_MAP, locationProviders);
输出是:gps,network
API 18 及以下的手机是否没有 HIGH_ACCURACY 优先级?
【问题讨论】:
【参考方案1】:我假设您想知道使用 API 级别 19 中已弃用的 Settings.Secure.LOCATION_PROVIDERS_ALLOWED
与使用 API 级别 19 中引入的 Settings.Secure.LOCATION_MODE
有何不同。
有了Settings.Secure.LOCATION_MODE
,你就有了这些值(你可能已经知道了):
LOCATION_MODE_HIGH_ACCURACY、LOCATION_MODE_SENSORS_ONLY、 LOCATION_MODE_BATTERY_SAVING,或 LOCATION_MODE_OFF
您可以通过这种方式将这些值映射到Settings.Secure.LOCATION_PROVIDERS_ALLOWED
:
LOCATION_MODE_HIGH_ACCURACY : "gps,network"
LOCATION_MODE_SENSORS_ONLY:“全球定位系统”
LOCATION_MODE_BATTERY_SAVING:“网络”
LOCATION_MODE_OFF : ""
请注意,在代码中,最好引用常量 LocationManager.GPS_PROVIDER
和 LocationManager.NETWORK_PROVIDER
而不仅仅是“gps”和“network”。
使用this answer 作为参考,您可以执行以下操作:
public static int getLocationMode(Context context)
int locationMode = 0;
String locationProviders;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
try
locationMode = Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.LOCATION_MODE);
catch (SettingNotFoundException e)
e.printStackTrace();
else
locationProviders = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
if (TextUtils.isEmpty(locationProviders))
locationMode = Settings.Secure.LOCATION_MODE_OFF;
else if (locationProviders.contains(LocationManager.GPS_PROVIDER) && locationProviders.contains(LocationManager.NETWORK_PROVIDER))
locationMode = Settings.Secure.LOCATION_MODE_HIGH_ACCURACY;
else if (locationProviders.contains(LocationManager.GPS_PROVIDER))
locationMode = Settings.Secure.LOCATION_MODE_SENSORS_ONLY;
else if (locationProviders.contains(LocationManager.NETWORK_PROVIDER))
locationMode = Settings.Secure.LOCATION_MODE_BATTERY_SAVING;
return locationMode;
【讨论】:
【参考方案2】:您可以使用此功能。我在 API 21 和 API 16 上进行了测试
public static boolean checkHighAccuracyLocationMode(Context context)
int locationMode = 0;
String locationProviders;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
//Equal or higher than API 19/KitKat
try
locationMode = Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.LOCATION_MODE);
if (locationMode == Settings.Secure.LOCATION_MODE_HIGH_ACCURACY)
return true;
catch (Settings.SettingNotFoundException e)
e.printStackTrace();
else
//Lower than API 19
locationProviders = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
if (locationProviders.contains(LocationManager.GPS_PROVIDER) && locationProviders.contains(LocationManager.NETWORK_PROVIDER))
return true;
return false;
请记住,HIGH_ACCURACY 模式意味着用户启用了 GPS 和 Network Provider。否则此函数将返回 false。
【讨论】:
【参考方案3】:试试这个Settings.Secure.LOCATION_MODE
String gpsStatus = android.provider.Settings.Secure.getString(mContext.getContentResolver(), Settings.Secure.LOCATION_MODE);
你可以使用这个检查
if (Build.VERSION.SDK_INT >= 21 &&
ActivityCompat.checkSelfPermission(mContext, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(mContext, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)
Log.e("gpsStatus", "LOCATION PERMISSION NOT GRANTED");
else
Log.d("gpsStatus", "LOCATION PERMISSION GRANTED");
if (gpsStatus.indexOf("gps", 0) < 3)
Log.d("gpsCheck", "DEVICE LOCATION PERMISSION IS GRANTED");
else
Log.e("gpsCheck", "DEVICE LOCATION PERMISSION NOT GRANTED");
【讨论】:
以上是关于如何在 API 18 及以下版本中检查位置是不是已开启并处于高优先级的主要内容,如果未能解决你的问题,请参考以下文章
如何检查数据是不是已完成加载以使用异步管道 Angular 8
如何使用 settimeout 函数检查谷歌地图 API 是不是已完全加载?