如何在 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_PROVIDERLocationManager.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 是不是已完全加载?

DbContext 的通用合并:如何检查实体是不是已附加?

如何检查是不是已加载 Google Maps API?

如何在 14 岁以下的 iOS 版本中检查核心位置授权状态?

如何检查隐藏文件是不是存在?