如何检查/确认用户是否已打开GPS?

时间:2016-08-09 13:55:11

标签: android android-studio gps android-6.0-marshmallow locationmanager

我正在开发一个应用程序,其中需要打开GPS才能获取用户的当前位置。

我使用此代码检查GPS的当前状态:

isGPSEnabled = locationManager
                .isProviderEnabled(LocationManager.GPS_PROVIDER);

然后我实现了这个进一步的代码:

    if (!isGPSEnabled) {
                    // ask to turn on GPS
                    Snackbar snackbar = Snackbar
                                    .make(coordinatorLayout, "No location detected!", Snackbar.LENGTH_LONG)
                                    .setAction("RETRY", new View.OnClickListener() {
                                        @Override
                                        public void onClick(View view) {
                                            Toast.makeText(getBaseContext(), "first called", Toast.LENGTH_SHORT).show();
                                            // same codes gets executed i.e. to check if user enabled GPS or not
                                        }
                                    });
                            snackbar.setDuration(Snackbar.LENGTH_INDEFINITE);
                            snackbar.show();
                } else {
                    // execute necessary code
                }

上面的代码是准确检查GPS的状态,但是当我再次打开GPS并点击“重试”时。 Snackbar的按钮,当GPS开启时应该执行的代码没有被执行,但是当GPS关闭时应该执行的代码正在执行。

是否,我需要任何类型的接收器或任何东西来确认用户在询问他/她之后是否已打开GPS?

请告诉我。

1 个答案:

答案 0 :(得分:0)

我没有在onClick方法中看到任何if语句,因此无论用户是否启用GPS,它都会执行该方法内的任何内容。

如果您不介意向用户显示Snackbar,您还可以使用广播接收器监听位置提供商更改。

在您的活动的onCreate方法上:

mLocationProviderChangedReceiver = new LocalLocationProviderChangedReceiver(this);
registerReceiver(mLocationProviderChangedReceiver, new IntentFilter(LocationManager.PROVIDERS_CHANGED_ACTION));

在您的Activity onDestroy方法:

if (mLocationProviderChangedReceiver != null) {
    unregisterReceiver(mLocationProviderChangedReceiver);
    mLocationProviderChangedReceiver = null;
}

创建静态内部类:

private static class LocalLocationProviderChangedReceiver extends BroadcastReceiver {

    private final WeakReference<MyActivity> mWeakActivity;

    public LocalLocationProviderChangedReceiver(@NonNull MyActivity activity) {
        mWeakActivity = new WeakReference<>(activity);
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        MyActivity activity = mWeakActivity.get();
        if (activity != null) {
            activity.refresh();
        }
    }

}

您的活动中的刷新方法:

public void refresh() {
    final LocationManager manager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    boolean isGpsEnabled = manager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    if (isGpsEnabled) {
        // TODO: Do what you need to do with the GPS
    } else {
        // TODO: e.g. Show a textview displaying a warning, maybe you could start the intent to activate the Location:
        // Intent i = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
        // startActivity(i);
    }
}