【问题标题】:Gps latitude and longitude doesn't give me a valid valueGps 纬度和经度没有给我一个有效的值
【发布时间】:2017-10-22 11:47:33
【问题描述】:

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

所以我做了这样的事情来获取位置:

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 小时前获得这些值,但我不知道它为什么停止工作。

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

【问题讨论】:

    标签: java android android-studio geolocation gps


    【解决方案1】:

    LocationManager.GPS_PROVIDER - 在这里您要求的是基于 GPS 的位置,而不是基于网络的位置。

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

    LocationRequest.PRIORITY_HIGH_ACCURACY 相同 - 高精度意味着基于 GPS 的位置。这不适用于模拟器。

    解决方案:
    如果要使用模拟器进行测试,请将GPS_PROVIDER改为NETWORK_PROVIDER

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

    【讨论】:

    • 那为什么模拟器有gps模拟器呢?如果它没有按预期工作?奇怪。
    • 我做了你提到的改变,仍然得到相同的结果
    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      • 1970-01-01
      相关资源
      最近更新 更多