2015-11-05 3 views
3

Я разрабатываю свой проект в SDK версии 23, где были добавлены разрешения приложений. В некоторых руководящих принципов, которые они использовали ниже код для чтения состояния разрешения телефона предоставляется или неРазрешение на проверку Android

if (ContextCompat.checkSelfPermission(serviceContext, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) { 
    //Read Phone state 
    }else{ 
} 

Но я прямой доступ checkSelfPermission как ниже

if(serviceContext.checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) { 
     //Read Phone state 
    }else{ 
} 

Это работает отлично. Вопрос в том, в чем разница между этими кодами ?, который является правильным способом проверить разрешение или нет?

+0

Проверить это - http://stackoverflow.com/a/7203752/3235048 –

ответ

9

Мой вопрос в чем разница между этими кодами?

Отсутствует, на устройствах API 23 (+).

Устройства, работающие с более старой версией Android, однако, будут вызывать ошибку при попытке напрямую позвонить context.checkSelfPermission(). Этот метод не был доступен до API 23.

ContextCompat обеспечивает обратный совместимый способ для запуска checkSelfPermission() на старых API. Если вы посмотрите на реализацию, вы увидите, что она выполнила это, просто делегируя вызов checkPermission() с параметрами процесса приложения. checkPermission() был доступен с самого первого выпуска API и, таким образом, будет работать по всем направлениям.

public static int checkSelfPermission(@NonNull Context context, @NonNull String permission) { 
    if (permission == null) { 
     throw new IllegalArgumentException("permission is null"); 
    } 

    return context.checkPermission(permission, android.os.Process.myPid(), Process.myUid()); 
} 

который является правильным способом проверить разрешение предоставляется или нет?

Таким образом, чтобы ответить на этот вопрос: если вы только поддерживающих устройств под управлением Android, «Зефир» 6.0 и новее, то вы можете использовать любой подход. Однако, поскольку, скорее всего, вы также захотите поддержать некоторые старые версии Android, использовать ContextCompat.

+0

Спасибо. я буду использовать его :) –

4

Кодирование на official and recent way для поддержки во всех устройствах использовать ниже фрагмент кода

просить разрешения, необходимо

// Here, thisActivity is the current activity 
    if (ContextCompat.checkSelfPermission(thisActivity, 
        Manifest.permission.READ_CONTACTS) 
      != PackageManager.PERMISSION_GRANTED) { 

     // Should we show an explanation? 
     if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, 
       Manifest.permission.READ_CONTACTS)) { 

      // Show an expanation to the user *asynchronously* -- don't block 
      // this thread waiting for the user's response! After the user 
      // sees the explanation, try again to request the permission. 

     } else { 

      // No explanation needed, we can request the permission. 

      ActivityCompat.requestPermissions(thisActivity, 
        new String[]{Manifest.permission.READ_CONTACTS}, 
        MY_PERMISSIONS_REQUEST_READ_CONTACTS); 

      // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an 
      // app-defined int constant. The callback method gets the 
      // result of the request. 
     } 
    } 

обработки ответа запроса разрешений

@Override 
public void onRequestPermissionsResult(int requestCode, 
     String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case MY_PERMISSIONS_REQUEST_READ_CONTACTS: { 
      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 
       && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

       // permission was granted, yay! Do the 
       // contacts-related task you need to do. 

      } else { 

       // permission denied, boo! Disable the 
       // functionality that depends on this permission. 
      } 
      return; 
     } 

     // other 'case' lines to check for other 
     // permissions this app might request 
    } 
} 
+0

Благодаря @Anoop. Я получил ответ. –

0

Другое решение:

//Requesting permission 
private void requestStoragePermission(){ 

    if (ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.READ_EXTERNAL_STORAGE)){ 
     //If the user has denied the permission previously your code will come to this block 
     //Here you can explain why you need this permission 
     //Explain here why you need this permission 
    } 

    //And finally ask for the permission 
    ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},STORAGE_PERMISSION_CODE); 
} 

//This method will be called when the user will tap on allow or deny 
@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 

    //Checking the request code of our request 
    if(requestCode == STORAGE_PERMISSION_CODE){ 

     //If permission is granted 
     if(grantResults.length >0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ 

      //Displaying a toast 
      Toast.makeText(this,"Permission granted now you can read the storage",Toast.LENGTH_LONG).show(); 
     }else{ 
      //Displaying another toast if permission is not granted 
      Toast.makeText(this,"Oops you just denied the permission",Toast.LENGTH_LONG).show(); 
     } 
    } 
} 
Смежные вопросы