Android M - GPS onLocationChanged问题

时间:2016-09-16 04:44:35

标签: android gps location android-6.0-marshmallow

我需要获得gps坐标,我有以下内容:

public class Splash extends AppCompatActivity implements LocationListener {

SessionManagement sessionManagement;
private Intent i;

static final Integer LOCATION = 0x1;
static final Integer GPS_SETTINGS = 0x7;

GoogleApiClient client;
LocationRequest mLocationRequest;
PendingResult<LocationSettingsResult> result;
LocationManager locationManager;
String mProvider;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);

    askForPermission(Manifest.permission.ACCESS_FINE_LOCATION, LOCATION);
    client = new GoogleApiClient.Builder(this)
            .addApi(AppIndex.API)
            .addApi(LocationServices.API)
            .build();

    //locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    //Criteria criteria = new Criteria();
    //mProvider = locationManager.getBestProvider(criteria, false);
}

@Override
public void onLocationChanged(Location location) {

    String msg = "New Latitude: " + location.getLatitude()
            + "New Longitude: " + location.getLongitude();

    Toast.makeText(getBaseContext(), msg, Toast.LENGTH_LONG).show();
}

private void askForPermission(String permission, Integer requestCode) {
    if (ContextCompat.checkSelfPermission(Splash.this, permission) != PackageManager.PERMISSION_GRANTED) {

        if (ActivityCompat.shouldShowRequestPermissionRationale(Splash.this, permission)) {

            ActivityCompat.requestPermissions(Splash.this, new String[]{permission}, requestCode);

        } else {

            ActivityCompat.requestPermissions(Splash.this, new String[]{permission}, requestCode);
        }
    } else {
        Toast.makeText(this, "" + permission + " is already granted.", Toast.LENGTH_SHORT).show();
    }
}

@Override
public void onStart() {
    super.onStart();
    client.connect();
}

@Override
public void onStop() {
    super.onStop();
    client.disconnect();
}

private void askForGPS(){
    mLocationRequest = LocationRequest.create();
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    mLocationRequest.setInterval(30 * 1000);
    mLocationRequest.setFastestInterval(5 * 1000);
    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder().addLocationRequest(mLocationRequest);
    builder.setAlwaysShow(true);

    result = LocationServices.SettingsApi.checkLocationSettings(client, builder.build());
    result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
        @Override
        public void onResult(LocationSettingsResult result) {
            final Status status = result.getStatus();
            Log.e("LOCATION", result.toString());
            switch (status.getStatusCode()) {
                case LocationSettingsStatusCodes.SUCCESS:
                    break;
                case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                    try {
                        status.startResolutionForResult(Splash.this, GPS_SETTINGS);
                    } catch (IntentSender.SendIntentException e) {

                    }
                    break;
                case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                    break;
            }
        }
    });
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if(ActivityCompat.checkSelfPermission(this, permissions[0]) == PackageManager.PERMISSION_GRANTED){
        switch (requestCode) {
            //Location
            case 1:
                askForGPS();
                break;
        }
        Toast.makeText(this, "Permission granted", Toast.LENGTH_SHORT).show();
    }else{
        Toast.makeText(this, "Permission denied", Toast.LENGTH_SHORT).show();
    }
}

}

似乎onLocationChanged从未被解雇过。我究竟做错了什么?这是我第一次使用checkPermission。 清单有INTERNET和ACCESS_FINE_LOCATION

有人能帮帮我吗?非常感谢,提前感谢。

1 个答案:

答案 0 :(得分:0)

您需要提供运行时权限,在Android M及更高版本的Android中,您需要为您的应用提供运行时权限。

现在,您在AndroidManifest.xml中声明了权限并不重要。

您可以查看此链接以获取有关Android Runtime permissions.

的参考信息