【问题标题】:How to check if the user really enables the GPS location in Android?如何检查用户是否真的在 Android 中启用了 GPS 定位?
【发布时间】:2015-07-02 08:53:54
【问题描述】:

我的应用程序需要 GPS,因此当执行特定操作时,我会检查 GPS 是否已启用,如下所示(正如 Marcus 在 this 其他问题中所建议的那样):

if (!locationManager.isProviderEnabled( LocationManager.GPS_PROVIDER )) {
    buildAlertMessageNoGps();
}

rootView = inflater.inflate(R.layout.fragment_alert, container, false);
[...]

问题是用户无法通过位置设置启用 GPS(例如,通过单击“返回”按钮并返回应用程序)。在这种特殊情况下,片段会为相应进程注入布局,但 GPS 仍处于禁用状态。如何解决?

【问题讨论】:

    标签: android gps location fragment settings


    【解决方案1】:

    我想这就是您正在寻找的方法。 您必须检查 KitKat 以上的 android 版本。

    @SuppressLint("InlinedApi") @SuppressWarnings("deprecation")
    public static boolean isLocationEnabled(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();
            }
    
            return locationMode != Settings.Secure.LOCATION_MODE_OFF;
    
        }else{
            locationProviders =     Settings.Secure.getString(context.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
            return !TextUtils.isEmpty(locationProviders);
        }
    } 
    

    【讨论】:

    • 那么,您是否建议用您的方法替换我的if 条件?但是,我仍然不明白如何确定用户在输入位置设置后真的启用了 GPS 选项。
    • 是的,我建议你换成这个方法,它会返回“用户启用位置访问的程度”。根据为标志提供的 javadoc。
    • 抱歉,我没有找到解决问题的方法。假设我是用户并且 GPS 当前处于禁用状态。我点击菜单项,一个对话框询问我是否要启用 GPS,所以我点击“是”。现在,在位置设置中,我没有启用 GPS,而是单击“返回”按钮,所以我返回应用程序,GPS 仍然处于禁用状态,而布局现在已注入。您的方法如何解决这种情况?抱歉,我还是不明白……
    • 此检查将为您提供用户启用的当前位置访问级别。如果用户按下它,它将在下次触发时返回 false。因此,您必须在用户从设置中返回后再次进行此检查。
    • 是的,但问题只是:用户从设置中返回后的检查。这两个操作是异步的,所以我无法停止布局的注入......我应该在哪里再次检查?
    【解决方案2】:

    我通过在buildAlertMessageNoGps() 方法中将startActivity(...) 替换为startActivityForResult(...) 来解决。这样做时,我可以再次检查回调函数onActivityResult(...)中是否启用了GPS。

    【讨论】:

    • 我以为你默认是这样做的。
    猜你喜欢
    • 2016-03-05
    • 2014-09-10
    • 2014-04-26
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 2014-08-22
    相关资源
    最近更新 更多