Android即使启用也无法获取位置
Android unable to get location even if it is enabled
我正在使用以下方法获取用户的当前位置。问题是,如果用户已经启用了 GPS,它可能会起作用。但如果他们没有启用它,我会要求他们启用。他们启用它后,我仍然得到“无法找到位置”。我做错了什么?
在 checkLocation()
中,我检查用户是否启用了 GPS 或网络提供商;
private void checkLocation() {
LocationManager lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
if (!lm.isProviderEnabled(LocationManager.GPS_PROVIDER) && !lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
OnGPS();
} else {
getLocation(lm);
}
}
如果没有启用,我要求他们启用它。这是方法OnGPS()
private void OnGPS() {
final AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage("Enable GPS");
builder.setCancelable(true);
builder.setPositiveButton("Yes", (dialog, which) -> {
dialog.cancel();
startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
});
builder.setNegativeButton("No", (dialog, which) -> dialog.cancel());
final AlertDialog alertDialog = builder.create();
alertDialog.show();
}
下面是我的getLocation()
方法
private void getLocation(LocationManager lm) {
if (ActivityCompat.checkSelfPermission(
context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
}
else
{
LocationRequest locationRequest = LocationRequest.create();
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
.addLocationRequest(locationRequest);
LocationServices.getSettingsClient(getActivity()).checkLocationSettings(builder.build());
Task<LocationSettingsResponse> result =
LocationServices.getSettingsClient(getActivity()).checkLocationSettings(builder.build());
result.addOnCompleteListener(task -> {
try {
LocationSettingsResponse response = task.getResult(ApiException.class);
// All location settings are satisfied. The client can initialize location
// requests here.
} catch (ApiException exception) {
switch (exception.getStatusCode()) {
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
// Location settings are not satisfied. But could be fixed by showing the
// user a dialog.
try {
// Cast to a resolvable exception.
ResolvableApiException resolvable = (ResolvableApiException) exception;
// Show the dialog by calling startResolutionForResult(),
// and check the result in onActivityResult().
resolvable.startResolutionForResult(
getActivity(),
LocationRequest.PRIORITY_HIGH_ACCURACY);
} catch (IntentSender.SendIntentException e) {
// Ignore the error.
} catch (ClassCastException e) {
// Ignore, should be an impossible error.
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
// Location settings are not satisfied. However, we have no way to fix the
// settings so we won't show the dialog.
break;
}
}
});
Location locationGPS = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (locationGPS == null)
{
locationGPS = lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
}
if (locationGPS != null) {
double lat = locationGPS.getLatitude();
double longt = locationGPS.getLongitude();
myGeofire.setLocation(currentUserID, new GeoLocation(lat, longt), (key, error) -> {
if (error == null) {
Log.e("GEOFIRE","Location saved on server successfully!");
} else {
Log.e("GEOFIRE","There was an error saving the location to GeoFire: " + error);
}
});
latitude = String.valueOf(lat);
longitude = String.valueOf(longt);
// Toast.makeText(FindFriendsActivity.this, "Lat: " + latitude + " Long: " + longitude, Toast.LENGTH_LONG).show();
HashMap<String, Object> profileMap = new HashMap<>();
profileMap.put("lat", latitude);
profileMap.put("longt", longitude);
rootRef.child("Users").child(currentUserID).updateChildren(profileMap)
.addOnCompleteListener(task ->
{
if (task.isSuccessful()) {
Log.d("Location:", latitude + longitude);
//Toast.makeText(FindFriendsActivity.this, "Location updated successfully!" , Toast.LENGTH_SHORT).show();
}
else{
String errorMSG = Objects.requireNonNull(task.getException()).toString();
Toast.makeText(context, "Error : " + errorMSG, Toast.LENGTH_SHORT).show();
}
});
}
else
{
Toast.makeText(context, "Unable to find location.", Toast.LENGTH_SHORT).show();
}
}
}
最后是方法 onActivityResult()
和 onLocationChanged()
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case LocationRequest.PRIORITY_HIGH_ACCURACY:
switch (resultCode) {
case Activity.RESULT_OK:
// All required changes were successfully made
Log.i("TAG", "onActivityResult: GPS Enabled by user");
checkLocation();
break;
case Activity.RESULT_CANCELED:
// The user was asked to change settings, but chose not to
Log.i("TAG", "onActivityResult: User rejected GPS request");
checkLocation();
break;
default:
break;
}
break;
}
}
@Override
public void onLocationChanged(@NonNull Location location) {
latitude = String.valueOf(location.getLatitude());
longitude = String.valueOf(location.getLongitude());
checkLocation();
}
我能够通过添加行来解决它
if (locationGPS == null) {
LocationManager locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
locationGPS = locationManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER);
}
在我的 getLocation()
方法中
Location locationGPS = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (locationGPS == null)
{
locationGPS = lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
}
我正在使用以下方法获取用户的当前位置。问题是,如果用户已经启用了 GPS,它可能会起作用。但如果他们没有启用它,我会要求他们启用。他们启用它后,我仍然得到“无法找到位置”。我做错了什么?
在 checkLocation()
中,我检查用户是否启用了 GPS 或网络提供商;
private void checkLocation() {
LocationManager lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
if (!lm.isProviderEnabled(LocationManager.GPS_PROVIDER) && !lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
OnGPS();
} else {
getLocation(lm);
}
}
如果没有启用,我要求他们启用它。这是方法OnGPS()
private void OnGPS() {
final AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage("Enable GPS");
builder.setCancelable(true);
builder.setPositiveButton("Yes", (dialog, which) -> {
dialog.cancel();
startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
});
builder.setNegativeButton("No", (dialog, which) -> dialog.cancel());
final AlertDialog alertDialog = builder.create();
alertDialog.show();
}
下面是我的getLocation()
方法
private void getLocation(LocationManager lm) {
if (ActivityCompat.checkSelfPermission(
context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
}
else
{
LocationRequest locationRequest = LocationRequest.create();
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
.addLocationRequest(locationRequest);
LocationServices.getSettingsClient(getActivity()).checkLocationSettings(builder.build());
Task<LocationSettingsResponse> result =
LocationServices.getSettingsClient(getActivity()).checkLocationSettings(builder.build());
result.addOnCompleteListener(task -> {
try {
LocationSettingsResponse response = task.getResult(ApiException.class);
// All location settings are satisfied. The client can initialize location
// requests here.
} catch (ApiException exception) {
switch (exception.getStatusCode()) {
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
// Location settings are not satisfied. But could be fixed by showing the
// user a dialog.
try {
// Cast to a resolvable exception.
ResolvableApiException resolvable = (ResolvableApiException) exception;
// Show the dialog by calling startResolutionForResult(),
// and check the result in onActivityResult().
resolvable.startResolutionForResult(
getActivity(),
LocationRequest.PRIORITY_HIGH_ACCURACY);
} catch (IntentSender.SendIntentException e) {
// Ignore the error.
} catch (ClassCastException e) {
// Ignore, should be an impossible error.
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
// Location settings are not satisfied. However, we have no way to fix the
// settings so we won't show the dialog.
break;
}
}
});
Location locationGPS = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (locationGPS == null)
{
locationGPS = lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
}
if (locationGPS != null) {
double lat = locationGPS.getLatitude();
double longt = locationGPS.getLongitude();
myGeofire.setLocation(currentUserID, new GeoLocation(lat, longt), (key, error) -> {
if (error == null) {
Log.e("GEOFIRE","Location saved on server successfully!");
} else {
Log.e("GEOFIRE","There was an error saving the location to GeoFire: " + error);
}
});
latitude = String.valueOf(lat);
longitude = String.valueOf(longt);
// Toast.makeText(FindFriendsActivity.this, "Lat: " + latitude + " Long: " + longitude, Toast.LENGTH_LONG).show();
HashMap<String, Object> profileMap = new HashMap<>();
profileMap.put("lat", latitude);
profileMap.put("longt", longitude);
rootRef.child("Users").child(currentUserID).updateChildren(profileMap)
.addOnCompleteListener(task ->
{
if (task.isSuccessful()) {
Log.d("Location:", latitude + longitude);
//Toast.makeText(FindFriendsActivity.this, "Location updated successfully!" , Toast.LENGTH_SHORT).show();
}
else{
String errorMSG = Objects.requireNonNull(task.getException()).toString();
Toast.makeText(context, "Error : " + errorMSG, Toast.LENGTH_SHORT).show();
}
});
}
else
{
Toast.makeText(context, "Unable to find location.", Toast.LENGTH_SHORT).show();
}
}
}
最后是方法 onActivityResult()
和 onLocationChanged()
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case LocationRequest.PRIORITY_HIGH_ACCURACY:
switch (resultCode) {
case Activity.RESULT_OK:
// All required changes were successfully made
Log.i("TAG", "onActivityResult: GPS Enabled by user");
checkLocation();
break;
case Activity.RESULT_CANCELED:
// The user was asked to change settings, but chose not to
Log.i("TAG", "onActivityResult: User rejected GPS request");
checkLocation();
break;
default:
break;
}
break;
}
}
@Override
public void onLocationChanged(@NonNull Location location) {
latitude = String.valueOf(location.getLatitude());
longitude = String.valueOf(location.getLongitude());
checkLocation();
}
我能够通过添加行来解决它
if (locationGPS == null) {
LocationManager locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
locationGPS = locationManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER);
}
在我的 getLocation()
方法中
Location locationGPS = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (locationGPS == null)
{
locationGPS = lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
}