Как включить местоположение в леденце или выше версии и получить текущее местоположение

Я пытаюсь включить местоположение GPS в устройстве с леденцами (не в эмуляторе). Я написал код разрешения в реальном времени, но работает неправильно. Это мой источник:

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

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();
            switch (status.getStatusCode()) {
                case LocationSettingsStatusCodes.SUCCESS:
                    break;
                case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                    try {
                        status.startResolutionForResult(MainActivity.this, GPS_SETTINGS);
                    } catch (IntentSender.SendIntentException e) {
                        e.printStackTrace();

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

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

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

        } else {

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

При нажатии кнопки я пытаюсь спросить разрешение, как это.

askForPermission(Manifest.permission.ACCESS_FINE_LOCATION,LOCATION);

Когда я запускаю свое приложение, я не могу показать alertDialog и не могу включить местоположение. Я не знаю, но программа, показывающая это сообщение Toast, «уже предоставлена». Мой метод askForPermission работает неправильно. Мой вопрос в том, как я могу включить GPS с разрешением в реальном времени и получить текущее местоположение?

 public void getCurrenctLocation(Location location)
{
    Log.e("Current lang", location.getLatitude()+"");
    Log.e("Current long", location.getLongitude()+"");
}

Как и где я могу использовать свой метод getCurrenctLocation? благодарить


person BekaKK    schedule 15.03.2017    source источник


Ответы (1)


1) Измените свой askForPermission() следующим образом:

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

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

    } else {
           askForGPS();
    }
}

2) Измените onRequePermissionResult(), как показано ниже:

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
     switch (requestCode) {
        case LOCATION:            //You have to declare LOCATION globally. example: private int LOCATION = 1 ;

            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // Permission Granted
                askForGPS();
                Toast.makeText(this, "Permission granted", Toast.LENGTH_SHORT).show();
            }            
            else {
                 if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, permissions[0])) {
                     Toast.makeText(this, "Permission denied", Toast.LENGTH_SHORT).show();
                  } else {
                      Toast.makeText(this, "Permission denied permanently, please go to app settings to grant permission.", Toast.LENGTH_SHORT).show(); 
                  }
            }
            break;
    }
}
person tahsinRupam    schedule 15.03.2017
comment
Спасибо за внимание. Как я могу использовать метод getCurrenctLocation для проверки текущего местоположения после включения GPS? @tahsinRupam - person BekaKK; 16.03.2017
comment
вы можете получить местоположение с помощью прослушивателя getLastLocation/изменения местоположения - person tahsinRupam; 16.03.2017
comment
можете ли вы сказать мне, что такое разрешение в onRequestPermissionsResult @tahsinRupam - person BekaKK; 18.03.2017
comment
Разрешение, которое вы запрашиваете в строке (например, Manifest.permission.WRITE_EXTERNAL_STORAGE) - person tahsinRupam; 18.03.2017