Я нашел бит и куски этого ответа, разбросанные по другим сообщениям, но я хотел записать его здесь для других.
Как я могу просто запросить местоположение пользователя GPS и/или сети, и если они не включили службу, предложите им сделать это?
Я нашел бит и куски этого ответа, разбросанные по другим сообщениям, но я хотел записать его здесь для других.
Как я могу просто запросить местоположение пользователя GPS и/или сети, и если они не включили службу, предложите им сделать это?
Если вы хотите захватить местоположение нажатием кнопки, вот как вы это сделаете. Если у пользователя нет службы определения местоположения, это отправит их в меню настроек, чтобы включить его.
Во-первых, вы должны добавить в свой манифест разрешение "android.permission.ACCESS_COARSE_LOCATION". Если вам нужен GPS (сетевое местоположение недостаточно чувствительно), вместо этого добавьте разрешение "android.permission.ACCESS_FINE_LOCATION" и измените "Criteria.ACCURACY_COARSE" на "Criteria.ACCURACY_FINE"
Button gpsButton = (Button)this.findViewById(R.id.buttonGPSLocation);
gpsButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// Start loction service
LocationManager locationManager = (LocationManager)[OUTERCLASS].this.getSystemService(Context.LOCATION_SERVICE);
Criteria locationCritera = new Criteria();
locationCritera.setAccuracy(Criteria.ACCURACY_COARSE);
locationCritera.setAltitudeRequired(false);
locationCritera.setBearingRequired(false);
locationCritera.setCostAllowed(true);
locationCritera.setPowerRequirement(Criteria.NO_REQUIREMENT);
String providerName = locationManager.getBestProvider(locationCritera, true);
if (providerName != null && locationManager.isProviderEnabled(providerName)) {
// Provider is enabled
locationManager.requestLocationUpdates(providerName, 20000, 100, [OUTERCLASS].this.locationListener);
} else {
// Provider not enabled, prompt user to enable it
Toast.makeText([OUTERCLASS].this, R.string.please_turn_on_gps, Toast.LENGTH_LONG).show();
Intent myIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
[OUTERCLASS].this.startActivity(myIntent);
}
}
});
В моем внешнем классе установлен этот слушатель
private final LocationListener locationListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
[OUTERCLASS].this.gpsLocationReceived(location);
}
@Override
public void onProviderDisabled(String provider) {}
@Override
public void onProviderEnabled(String provider) {}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {}
};
Затем, когда вы хотите прекратить прослушивание, вызовите это. Вы должны хотя бы сделать этот вызов во время своей деятельности методом onStop.
LocationManager locationManager = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE);
locationManager.removeUpdates(this.locationListener);
Пройдя много ответов на Stack Overflow, я нашел, что этот метод работает отлично и даже не требует большого количества кода.
Объявите int GPSoff = 0
как глобальную переменную.
Теперь, когда вам нужно проверить текущий статус GPS и перенаправить пользователя на включение GPS, используйте это:
try {
GPSoff = Settings.Secure.getInt(getContentResolver(),Settings.Secure.LOCATION_MODE);
} catch (Settings.SettingNotFoundException e) {
e.printStackTrace();
}
if (GPSoff == 0) {
showMessageOKCancel("You need to turn Location On",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent onGPS = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(onGPS);
}
});
}
Чтобы пригласить пользователя включить службы определения местоположения, вы должны использовать новый параметр LocationRequest, включенный в сервисы Google Play, вы можете найти полное руководство в LocationRequest