Android M и выше, курс определения местоположения и местоположение исправны, разрешение предоставлено true

#android #android-6.0-marshmallow #android-permissions

#Android #android-6.0-marshmallow #android-разрешения

Вопрос:

Я пытаюсь получить доступ к местоположениям пользователей и просто разобраться с разрешениями. Итак, я понимаю, что на 23 и выше, независимо от манифеста, пользователь должен предоставить разрешение.

Итак, у меня это есть в манифесте, подобном этому, для более старых версий:

 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  

Для более новой версии > = 23 я тестирую так, прежде чем показывать диалоговое окно:

 // Check for runtime location permissions
private boolean hasRunTimeLocationPermission() {
    int courseLocationPermission = ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.ACCESS_COARSE_LOCATION);
    return  (courseLocationPermission == PackageManager.PERMISSION_GRANTED );
}
  

Насколько я понял, это должно возвращать false в первый раз, но оно возвращает true.

Действительно ли пользователь должен отключать службы определения местоположения или это считается «опасным» и должно быть одобрено в первый раз?

Также я использую новый api-интерфейс эмулятора 23, когда я просматриваю разрешения на местоположение, в нем говорится, что ни одно приложение не запрашивало местоположение.

Спасибо за вашу помощь

Комментарии:

1. Вы проверяете это условие фрагментарно?

2. Да, я это меняет?

3. В методе запуска фрагмента

4. @MadhukarHebbar Спасибо, разрешение для приложения установлено на вкл. Я думал, что это не было сделано по умолчанию?

5. @MadhukarHebbar Это то, что вызвало проблему, Спасибо! по какой-то причине эмулятор запустился с тем, что для этого разрешения установлено значение true. Вы знаете, что это произойдет?

Ответ №1:

Попробуйте это.

 // Check for runtime location permissions
private boolean hasRunTimeLocationPermission() {
    int courseLocationPermission = ContextCompat.checkSelfPermission(getActivity(), android.Manifest.permission.ACCESS_COARSE_LOCATION);
    return  (courseLocationPermission == PackageManager.PERMISSION_GRANTED );
}
  

Комментарии:

1. Спасибо за ваш ответ. Это ничего не меняет, хотя извините.

Ответ №2:

ПОПРОБУЙТЕ ЭТО:

 private boolean hasRunTimeLocationPermission() {
 if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED)
        {
            return false;
        }
 else
        {
           return true;
        }
      }
  

Ответ №3:

Проверьте разрешения следующим образом :-

 Check permissions like this :-

if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION)) {
            //Show Information about why you need the permission
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
            builder.setTitle("Need Location Permission");
            builder.setMessage("This app needs location permission.");
            builder.setPositiveButton("Grant", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, ACCESS_COARSE_LOCATION_CONSTANT);
                }
            });
            builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                }
            });
            builder.show();
        } else if (permissionStatus.getBoolean(Manifest.permission.ACCESS_COARSE_LOCATION,false)) {
            //Previously Permission Request was cancelled with 'Dont Ask Again',
            // Redirect to Settings after showing Information about why you need the permission
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
            builder.setTitle("Need Location Permission");
            builder.setMessage("This app needs location permission.");
            builder.setPositiveButton("Grant", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                    sentToSettings = true;
                    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                    Uri uri = Uri.fromParts("package", getPackageName(), null);
                    intent.setData(uri);
                    startActivityForResult(intent, REQUEST_PERMISSION_SETTING);
                    Toast.makeText(getBaseContext(), "Go to Permissions to Grant Location", Toast.LENGTH_LONG).show();
                }
            });
            builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                }
            });
            builder.show();
        } else {
            //just request the permission
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, ACCESS_COARSE_LOCATION_CONSTANT);
        }

        SharedPreferences.Editor editor = permissionStatus.edit();
        editor.putBoolean(Manifest.permission.ACCESS_COARSE_LOCATION,true);
        editor.commit();


    } else {
        //You already have the permission, just go ahead.
        proceedAfterPermission();
    }
  

Ответ №4:

Добавьте это в манифест даже для api>23

 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  

А затем запрашивайте разрешения во время выполнения следующим образом :-

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

И для обработки результатов восстановления используйте это:-

 @Override
public void onRequestPermissionsResult(int requestCode,
                                   String permissions[], int[] grantResults) {
switch (requestCode) {
    case 1: {

      // If request is cancelled, the result arrays are empty.
      if (grantResults.length > 0
                amp;amp; grantResults[0] == PackageManager.PERMISSION_GRANTED) {

            // permission was granted, yay! Do the
        } else {

            // permission denied, boo! 
            Toast.makeText(MainActivity.this, "Permission denied to read your External storage", Toast.LENGTH_SHORT).show();
        }
        return;
    }
}
}