2016-03-15 2 views
3

Я столкнулся с проверкой значения разрешения в Android 6.0 (API 23). Всегда получать значение 0 даже разрешить разрешение или отключить настройки приложения.Android targetSdkVersion 23 checkSelfPermission метод

Ниже приводится шаг, который я взял.

Разрешение на подключение вручную отключено от устройства settings->apps-> My apps-> permission -> Disable contact permission.

Still В Android 6.0 каждый раз, когда значение 0 при выполнении ниже строки кода.

ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_CONTACTS) 

Ниже мой код. которые я определяю в классе основной пусковой деятельности

// Identifier for the permission request 
private static final int WRITE_CONTACTS_PERMISSIONS_REQUEST = 9; 
........ 

@Override 
public void onCreate(Bundle savedInstanceState) { 
.... 
if (android.os.Build.VERSION.SDK_INT <= android.os.Build.VERSION_CODES.LOLLIPOP_MR1) 
    { 
     sharedPreferencesEditor.putBoolean(getString(R.string.ALLOW_ACCESS_PHONEBOOK), true); 
     sharedPreferencesEditor.commit(); 
    } 
    else { 
     getPermissionToReadUserContacts(); 
    } 
.... 

} 


// Called when the user is performing an action which requires the app to read the 
// user's contacts 
public void getPermissionToReadUserContacts() { 
    // 1) Use the support library version ContextCompat.checkSelfPermission(...) to avoid 
    // checking the build version since Context.checkSelfPermission(...) is only available 
    // in Marshmallow 
    // 2) Always check for permission (even if permission has already been granted) 
    // since the user can revoke permissions at any time through Settings 
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_CONTACTS) 
      != PackageManager.PERMISSION_GRANTED) { 

     // The permission is NOT already granted. 
     // Check if the user has been asked about this permission already and denied 
     // it. If so, we want to give more explanation about why the permission is needed. 
     if (shouldShowRequestPermissionRationale(
       Manifest.permission.WRITE_CONTACTS)) { 
      // Show our own UI to explain to the user why we need to read the contacts 
      // before actually requesting the permission and showing the default UI 
     } 

     // Fire off an async request to actually get the permission 
     // This will show the standard permission request dialog UI 
     requestPermissions(new String[]{Manifest.permission.WRITE_CONTACTS}, 
       WRITE_CONTACTS_PERMISSIONS_REQUEST); 
    } 
} 

// Callback with the request from calling requestPermissions(...) 
@Override 
public void onRequestPermissionsResult(int requestCode, 
             @NonNull String permissions[], 
             @NonNull int[] grantResults) { 
    // Make sure it's our original READ_CONTACTS request 
    if (requestCode == WRITE_CONTACTS_PERMISSIONS_REQUEST) { 
     if (grantResults.length == 1 && 
       grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
      Toast.makeText(this, "Write Contacts permission granted", Toast.LENGTH_SHORT).show(); 
     } else { 
      Toast.makeText(this, "Write Contacts permission denied", Toast.LENGTH_SHORT).show(); 
     } 
    } else { 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    } 
} 
+0

Возможно также включить ваш соответствующий манифест –

+0

Убедитесь, что ваш компилятор SDK равно 23 также –

+0

Я создал класс RuntimePermissionHelper, который отлично подходит для меня. Надеюсь, это сработает для вас. Вы можете найти его здесь - https://gist.github.com/passiondroid/cd2ad32e7ba26f4e47ae – Passiondroid

ответ

2

Если цель SDK 23 (Android 6), все разрешения (в манифесте) отключены по умолчанию, в то время как, если ваш targetSDK 22 (Android 5.1) и ваше приложение работает на Android 6, все разрешения включаются по умолчанию, когда пользователь устанавливает приложение, и даже если пользователь отменяет разрешения позже, checkSelfPermission возвращает неправильное значение PERMISSION_GRANTED

Он также доступен в документация от PermissionChecker

В разрешениях новой модели разрешения с опасным уровнем защиты являются разрешениями времени выполнения. Для приложений с таргетингом M и выше пользователь не может предоставлять такие разрешения или отменять их в любое время. Для приложений с таргетингом API ниже M эти разрешения всегда предоставляются, так как такие приложения не ожидают разрешения на отмену и сбой. Поэтому, когда пользователь отключает разрешение для устаревшего приложения в пользовательском интерфейсе, платформа отключает API, защищенные этим разрешением, делая их no-op, который ничего не делает или не возвращает пустой результат или ошибку по умолчанию.

+2

Radu, Спасибо за ответ по этому вопросу. Итак, какое решение для этого «даже если пользователь снова отменяет разрешения, checkSelfPermission возвращает неправильное значение». Я хочу иметь правильное значение, если пользователь позже аннулирует разрешение. Это мои критерии применения. Потому что из моих приложений я обновляю контактные данные в контактной книге устройства, поэтому, если у пользователя есть разрешение на контакт, отмените позже, после чего, если пользователь попытается обновить контакт из моих приложений, поэтому приложения будут разбиты, поэтому перед этим мне нужно будет проверить, отменяет ли пользователь поэтому приложения не будут пытаться обновлять контакты из приложений. –

2

У меня была такая же проблема, но я понял, что существуют локальные модули с целевой версией ниже 23. После их удаления ошибка была решена.

+0

Ваше решение сработало и для меня :) – dima

Смежные вопросы