我正在开发一个应用程序,其中需要打开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?
请告诉我。
答案 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);
}
}