我有一个可以拍摄一些照片的应用程序。每次拍摄照片时,我都应该发送一个用户经纬度的请求,以便我知道拍摄照片的位置。
所以我做了这样的事情来获取位置:
public class GoogleLocation implements
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener {
private double lat;
private double lon;
private double alt;
private Context context;
LocationManager lm;
final int MY_PERMISSION_ACCESS_COURSE_LOCATION = 1;
public GoogleLocation(Context context) {
this.context = context;
}
public Map<String,String> getPosition() {
Map<String, String> params = new HashMap<String, String>();
lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
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((Activity) context, new String[] { android.Manifest.permission.ACCESS_COARSE_LOCATION },
MY_PERMISSION_ACCESS_COURSE_LOCATION);
}
Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER );
if(location != null){
lat = location.getLatitude();
lon = location.getLongitude();
alt = location.getAltitude();
}
params.put("lat",String.valueOf(lat));
params.put("lon",String.valueOf(lon));
params.put("alt",String.valueOf(alt));
return params;
}
public void location(){
GoogleApiClient googleApiClient = null;
if (googleApiClient == null) {
googleApiClient = new GoogleApiClient.Builder(context)
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
googleApiClient.connect();
LocationRequest locationRequest = LocationRequest.create();
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
locationRequest.setInterval(30 * 1000);
locationRequest.setFastestInterval(5 * 1000);
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
.addLocationRequest(locationRequest);
//**************************
builder.setAlwaysShow(true); //this is the key ingredient
//**************************
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();
final LocationSettingsStates state = result.getLocationSettingsStates();
switch (status.getStatusCode()) {
case LocationSettingsStatusCodes.SUCCESS:
// All location settings are satisfied. The client can initialize location
// requests here.
break;
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
// Location settings are not satisfied. But could be fixed by showing the user
// a dialog.
try {
// Show the dialog by calling startResolutionForResult(),
// and check the result in onActivityResult().
status.startResolutionForResult(
(Activity) context, 1000);
} catch (IntentSender.SendIntentException e) {
// Ignore the 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;
}
}
});
}
}
@Override
public void onConnected(@Nullable Bundle bundle) {
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
}
但我总是在我的GPS模拟器上获得lat lon的默认值0.0,我有一些为GPS定义的值,我可以在2小时前得到但我不知道为什么它停止了工作
我怎样才能得到它们,我在这里做错了什么?
答案 0 :(得分:0)
LocationManager.GPS_PROVIDER
- 您要求的是基于GPS的位置,而不是基于网络的位置。
基于GPS的位置意味着手机需要有GPS传感器来获取位置。您的模拟器没有该传感器。
与LocationRequest.PRIORITY_HIGH_ACCURACY
相同 - 高精度意味着基于GPS的位置。这不适用于模拟器。
解决方案:
如果您想使用模拟器进行测试,请将GPS_PROVIDER
更改为NETWORK_PROVIDER
。
OR
使用带有GPS传感器的真实手机(如今大多数手机都有)。
答案 1 :(得分:0)