Я создаю приложение, в котором мне нужно показать текущее местоположение пользователя на карте. Так что для этого, во-первых, проблема, с которой я столкнулся, была, когда пользователь входил в приложение, если его местоположение отключено, я запросил разрешение на включение местоположения, и даже после того, как пользователь дал мне разрешение, я все еще получаю нулевое значение в моем местоположении местоположения. функция и я получаю местоположение после того, как пользователь перезапустит приложение. Я получаю разрешение в spla sh, поэтому для этой проблемы перезапуска я сделал в spla sh Iam, перезапускающий активность в onActivityResult, вот так:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
displayLocationSettingsRequest();
}
private void displayLocationSettingsRequest() {
GoogleApiClient googleApiClient = new GoogleApiClient.Builder(this)
.addApi(LocationServices.API).build();
googleApiClient.connect();
LocationRequest locationRequest = LocationRequest.create();
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
locationRequest.setInterval(10000);
locationRequest.setFastestInterval(10000 / 2);
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder().addLocationRequest(locationRequest);
builder.setAlwaysShow(true);
PendingResult<LocationSettingsResult> result = LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build());
result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
@Override
public void onResult(LocationSettingsResult result) {
final Status status = result.getStatus();
switch (status.getStatusCode()) {
case LocationSettingsStatusCodes.SUCCESS:
startActivity(new Intent(getApplicationContext(), LoginActivity.class));
finish();
break;
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
try {
status.startResolutionForResult(SplashActivity.this, 7);
} catch (IntentSender.SendIntentException e) {
Toast.makeText(SplashActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
Toast.makeText(SplashActivity.this, "Location settings are inadequate, and cannot be fixed here. Dialog not created.", Toast.LENGTH_SHORT).show();
break;
}
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 7 && resultCode == RESULT_OK && data != null) {
finish();
overridePendingTransition(0, 0);
startActivity(getIntent());
overridePendingTransition(0, 0);
Toast.makeText(this, "entering", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "To continue please give permission for location", Toast.LENGTH_LONG).show();
displayLocationSettingsRequest();
}
}
@Override
protected void onRestart() {
super.onRestart();
if (ConnectivityReceiver.isNetworkConnected(this)) {
displayLocationSettingsRequest();
} else {
HelperClass.openAlertDialog(SplashActivity.this, Constants.alert, Constants.No_Internet_Msg, Constants.try_again, Constants.Dialog_cancel, this);
}
}
}
этот метод работал некоторое время, но после 1 день я все еще получаю ту же проблему, и теперь я получаю дополнительный крайний случай, что, если приложение работает через Wi-Fi, и я получаю диалоговое окно, чтобы дать разрешение на местоположение, то каждый раз, когда я получаю тот же диалог, даже после перезапуска приложения и предоставления разрешения и эта проблема будет решена после того, как я включу мобильные данные, запусти приложение для мобильных данных один раз и снова вернусь к wifi.
Это мой класс Location:
public class LocationUtil implements LocationListener {
private final Context mContext;
// flag for GPS status
private boolean isGPSEnabled = false;
// flag for network status
private boolean isNetworkEnabled = false;
// flag for GPS status
private boolean canGetLocation = false;
private Location location; // location
private double latitude; // latitude
private double longitude; // longitude
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters
private static final long MIN_TIME_BW_UPDATES = 1000 * 60; // 1 minute
private android.location.LocationManager locationManager;
public LocationUtil() {
this.mContext = null;
}
public LocationUtil(Context context) {
this.mContext = context;
getLocation();
}
public Location getLocation() {
try {
locationManager = (android.location.LocationManager) mContext.getSystemService(LOCATION_SERVICE);
if (locationManager != null) {
isGPSEnabled = locationManager.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER);
}
if (locationManager != null) {
isNetworkEnabled = locationManager.isProviderEnabled(android.location.LocationManager.NETWORK_PROVIDER);
}
if (isGPSEnabled || isNetworkEnabled) {
this.canGetLocation = true;
if (isNetworkEnabled) {
if (ActivityCompat.checkSelfPermission(this.mContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this.mContext, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
}
locationManager.requestLocationUpdates(android.location.LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("Network", "Network");
if (locationManager != null) {
location = locationManager.getLastKnownLocation(android.location.LocationManager.NETWORK_PROVIDER);
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude() ;
}
}
}
if (isGPSEnabled) {
if (location == null) {
if (locationManager != null) {
locationManager.requestLocationUpdates(android.location.LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
}
if (locationManager != null) {
location = locationManager.getLastKnownLocation(android.location.LocationManager.GPS_PROVIDER);
if (location != null) {
latitude = location.getLatitude() ;
longitude = location.getLongitude() ;
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
stopUsingGPS();
return location;
}
private void stopUsingGPS() {
if (locationManager != null) {
locationManager.removeUpdates(LocationUtil.this);
}
}
public double getLatitude() {
if (location != null) {
latitude = location.getLatitude();
}
return latitude;
}
public double getLongitude() {
if (location != null) {
longitude = location.getLongitude();
}
return longitude;
}
public boolean canGetLocation() {
return this.canGetLocation;
}
@Override
public void onLocationChanged(Location location) {
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude() ;
}
}
@Override
public void onProviderDisabled(String provider) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
public static boolean getLocationMode(Context context) {
try {
return Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.LOCATION_MODE) == 3;
} catch (Settings.SettingNotFoundException e) {
e.printStackTrace();
}
return false;
}
}
А здесь в моем месте получения MainActivity Iam:
protected void setupLocation() {
if (locManager == null)
locManager = new LocationUtil(MainActivity.this);
if (locManager.getLocation() != null) {
locationHelper = new LocationHelper(locManager.getLocation().getLatitude(), locManager.getLocation().getLongitude());
latitude = locationHelper.getLatitude();
longitude = locationHelper.getLongitude();
} else {
Toast.makeText(getApplicationContext(), "Please accept location improvement dialog or restart the application!", Toast.LENGTH_LONG).show();
startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
}
}
ПРИМЕЧАНИЕ. Я получаю lat long, но проблема возникает в разрешении, если перед запуском приложения местоположение отключено и я включаю приложение, оно даст мне нулевое значение и Я должен перезапустить приложение.