我必须从我的Android应用程序中的用户设备中获取位置。
我所做的事情如下:
First,我已经检查了运行时位置权限。拍得很成功。
第二,检查全球定位系统是否启用,如果全球定位系统提供商工作良好,可以从全球定位系统提供商获取纬度和经度。
如果全球定位系统关闭,第三代全球定位系统( Third )正试图从网络提供商那里获取位置。但是,在这种情况下,有时无法成功地获取位置。
所以,我必须让用户打开GPS,并在打开GPS后得到位置。
我很困惑,因为许多演示提供了启动GPS的意图。如何动态地打开GPS?如何通知用户打开GPS?
谢谢。
发布于 2020-01-09 12:21:46
这是Gradle插件,在我的例子中,它的版本是:“17.0”
implementation "com.google.android.gms:play-services-location:$parent.ext.playServicesVersion"
这是GpsUtils
类,
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.IntentSender;
import android.location.LocationManager;
import android.util.Log;
import android.widget.Toast;
import androidx.annotation.NonNull;
import com.google.android.gms.common.api.ApiException;
import com.google.android.gms.common.api.ResolvableApiException;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.location.LocationSettingsRequest;
import com.google.android.gms.location.LocationSettingsResponse;
import com.google.android.gms.location.LocationSettingsStatusCodes;
import com.google.android.gms.location.SettingsClient;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
public class GpsUtils {
private Context context;
private SettingsClient mSettingsClient;
private LocationSettingsRequest mLocationSettingsRequest;
private LocationManager locationManager;
private static final String TAG = GpsUtils.class.getSimpleName();
public GpsUtils(Context context) {
this.context = context;
locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
mSettingsClient = LocationServices.getSettingsClient(context);
LocationRequest locationRequest = LocationRequest.create();
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
locationRequest.setInterval(2 * 1000);
locationRequest.setFastestInterval(2 * 1000);
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
.addLocationRequest(locationRequest);
mLocationSettingsRequest = builder.build();
//**************************
builder.setAlwaysShow(true); //this is the key ingredient
//**************************
}
// method for turn on GPS
public void turnGPSOn(onGpsListener onGpsListener) {
if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
if (onGpsListener != null) {
onGpsListener.gpsStatus(true);
}
} else {
mSettingsClient
.checkLocationSettings(mLocationSettingsRequest)
.addOnSuccessListener((Activity) context, new OnSuccessListener<LocationSettingsResponse>() {
@SuppressLint("MissingPermission")
@Override
public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
// GPS is already enable, callback GPS status through listener
if (onGpsListener != null) {
onGpsListener.gpsStatus(true);
}
}
})
.addOnFailureListener((Activity) context, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
int statusCode = ((ApiException) e).getStatusCode();
switch (statusCode) {
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
try {
ResolvableApiException rae = (ResolvableApiException) e;
rae.startResolutionForResult((Activity) context, Appconstants.GPS_REQUEST);
} catch (IntentSender.SendIntentException sie) {
Log.i(TAG, "PendingIntent unable to execute request.");
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
String errorMessage = "Location settings are inadequate, and cannot be " +
"fixed here. Fix in Settings.";
Toast.makeText((Activity) context, errorMessage, Toast.LENGTH_LONG).show();
}
}
});
}
}
public interface onGpsListener {
void gpsStatus(boolean isGPSEnable);
}
}
您可以从您的活动中调用下面的函数,让用户启用GPS。我将GPSUtils类保存在java本身中,因为它是可互操作的。
GpsUtils(this).turnGPSOn { isGPSEnable ->
isGPS = isGPSEnable // You can get the callback here..
}
您可以从SettingsClient
的这里上了解更多关于它的信息。
https://stackoverflow.com/questions/59662900
复制相似问题