Java Gps纬度和经度不';我不能给我一个有效的值

Java Gps纬度和经度不';我不能给我一个有效的值,java,android,android-studio,geolocation,gps,Java,Android,Android Studio,Geolocation,Gps,我有一个可以拍摄一些照片的应用程序。每次我拍摄一张照片时,我都会发送一个带有用户纬度和经度的请求,这样我就可以知道照片是在哪里拍摄的 所以我做了类似的事情来获取位置: public class GoogleLocation implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { private double lat;

我有一个可以拍摄一些照片的应用程序。每次我拍摄一张照片时,我都会发送一个带有用户纬度和经度的请求,这样我就可以知道照片是在哪里拍摄的

所以我做了类似的事情来获取位置:

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) {

    }
}
GoogleLocation实现的公共类
GoogleAppClient.ConnectionCallbacks,
GoogleAppClient.OnConnectionFailedListener{
私人双lat;
私人双伦敦;
私人双alt;
私人语境;
位置经理lm;
最终int MY_PERMISSION_ACCESS_COURSE_LOCATION=1;
公共谷歌定位(上下文){
this.context=上下文;
}
公共地图getPosition(){
Map params=新的HashMap();
lm=(LocationManager)context.getSystemService(context.LOCATION\u服务);
if(ActivityCompat.checkSelfPermission(context,Manifest.permission.ACCESS\u FINE\u LOCATION)!=PackageManager.permission\u已授予和&ActivityCompat.checkSelfPermission(context,Manifest.permission.ACCESS\u LOCATION)!=PackageManager.permission\u已授予){
ActivityCompat.requestPermissions((活动)上下文,新字符串[]{android.Manifest.permission.ACCESS\u rough\u LOCATION},
我的(许可)(进入)(课程)(地点);;
}
位置=lm.getLastKnownLocation(LocationManager.GPS\u提供程序);
如果(位置!=null){
lat=位置。getLatitude();
lon=location.getLongitude();
alt=location.getAltitude();
}
参数put(“lat”,String.valueOf(lat));
参数put(“lon”,String.valueOf(lon));
参数put(“alt”,String.valueOf(alt));
返回参数;
}
公共位置(){
GoogleAppClient GoogleAppClient=null;
if(googleApiClient==null){
GoogleAppClient=新的GoogleAppClient.Builder(上下文)
.addApi(LocationServices.API)
.addConnectionCallbacks(此)
.addOnConnectionFailedListener(此)
.build();
googleApiClient.connect();
LocationRequest LocationRequest=LocationRequest.create();
locationRequest.setPriority(locationRequest.PRIORITY\u高精度);
位置请求设置间隔(30*1000);
locationRequest.SetFastTestInterval(5*1000);
LocationSettingsRequest.Builder=新建LocationSettingsRequest.Builder()
.addLocationRequest(locationRequest);
//**************************
builder.setAlwaysShow(true);//这是关键要素
//**************************
Pendingreult结果=
LocationServices.SettingsApi.checkLocationSettings(GoogleAppClient,builder.build());
result.setResultCallback(新的ResultCallback(){
@凌驾
公共void onResult(位置设置结果){
最终状态状态=result.getStatus();
最终位置SettingsStates状态=结果。getLocationSettingsStates();
开关(status.getStatusCode()){
案例位置设置StatusCodes.SUCCESS:
//满足所有位置设置。客户端可以初始化位置
//请求在这里。
打破
案例位置设置StatusCodes.RESOLUTION_要求:
//不满足位置设置。但可以通过显示用户来修复
//对话。
试一试{
//通过调用startResolutionForResult()显示对话框,
//并在onActivityResult()中检查结果。
status.StartResult解决方案(
(活动)背景,1000);
}catch(IntentSender.sendtintentexe){
//忽略错误。
}
打破
案例位置设置StatusCodes.SETTINGS\u CHANGE\u不可用:
//位置设置不满意。但是,我们无法修复此问题
//设置,这样我们就不会显示对话框。
打破
}
}
});
}
}
@凌驾
未连接的公共无效(@Nullable Bundle){
}
@凌驾
公共空间连接暂停(int i){
}
@凌驾
public void onconnection失败(@NonNull ConnectionResult ConnectionResult){
}
}
但是我总是得到lat-lon的默认值,0.0,在我的GPS模拟器上,我为GPS定义了一些值,我可以在2小时前得到这些值,但我不知道它为什么停止工作


我怎样才能得到它们,我做错了什么?

LocationManager.GPS\u提供商
-这里您要求的是基于GPS的位置,而不是基于网络的位置

基于GPS的定位意味着手机需要有GPS传感器才能获得位置。你的模拟器没有那个传感器

与定位请求相同。优先级高精度-高精度意味着基于GPS的定位。这不适用于模拟器

解决方案:
如果要使用emulator进行测试,请将
GPS\U提供程序
更改为
网络\U提供程序


使用带有GPS传感器的真实手机(现在大多数手机都有)。

检查以下链接是否有帮助:

那么为什么模拟器有GPS模拟器?如果它不能像Expected那样工作?奇怪。我做了你提到的更改,但仍然得到相同的结果