1

Я работаю над приложением Android, в котором мне нужно спросить у пользователя разрешение на контакт перед загрузкой контактов. Ниже приведен код, который я использую для контактов. Разрешение для Build.VERSION.SDK_INT >= Build.VERSION_CODES.M.Контактное разрешение во всех версиях Android

Но проблема в том, что мне всегда нужно запрашивать разрешение на контакт каждый раз, даже ниже, до Android M. Как запросить разрешение на контакт, которое должно работать на всех версиях SDK?

private void getContact(){ 
//  Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); 
//  startActivityForResult(intent, PICK_CONTACT); 
    } 

    public void askForContactPermission(){ 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      if (ContextCompat.checkSelfPermission(this,Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { 

       // Should we show an explanation? 
       if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
         Manifest.permission.READ_CONTACTS)) { 
        AlertDialog.Builder builder = new AlertDialog.Builder(this); 
        builder.setTitle("Contacts access needed"); 
        builder.setPositiveButton(android.R.string.ok, null); 
        builder.setMessage("please confirm Contacts access");//TODO put real question 
        builder.setOnDismissListener(new DialogInterface.OnDismissListener() { 
         @TargetApi(Build.VERSION_CODES.M) 
         @Override 
         public void onDismiss(DialogInterface dialog) { 
          requestPermissions(
            new String[] 
              {Manifest.permission.READ_CONTACTS} 
            , PERMISSION_REQUEST_CONTACT); 
         } 
        }); 
        builder.show(); 
        // 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(this, 
          new String[]{Manifest.permission.READ_CONTACTS}, 
          PERMISSION_REQUEST_CONTACT); 

        // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an 
        // app-defined int constant. The callback method gets the 
        // result of the request. 
       } 
      }else{ 
       getContact(); 
      } 
     } 
     else{ 
      getContact(); 
     } 
    } 

    int PERMISSION_REQUEST_CONTACT = 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 
         && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
//     getContact(); 
        Toast.makeText(getApplicationContext(),"Permission is Done",Toast.LENGTH_LONG).show(); 
        // permission was granted, yay! Do the 
        // contacts-related task you need to do. 

       } else { 
        Toast.makeText(getApplicationContext(),"No permission for contacts",Toast.LENGTH_LONG).show(); 
        // permission denied, boo! Disable the 
        // functionality that depends on this permission. 
       } 
       return; 
      } 

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

Ниже M вам не нужно писать внешний код, кроме файла манифеста. – Spartan

+0

@PushpendraChoudhary благодарит за ваш комментарий здесь. На самом деле мое требование - показать сообщение для «Разрешений на доступ». Возможно ли ниже для Android M мы можем запрограммировать запрос на контакт? –

+0

Проблема находится под Android M, она не просит разрешения на контакт. Мне нужно показать диалог ниже на этом уровне SDK. –

ответ

1

Создайте метод для отображения диалогового окна с запросом на разрешение, которое всегда показывает диалог, но только вызывает разрешение API на Android M и выше:

public void showDialog() { 
    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setTitle("Contacts access needed"); 
    builder.setPositiveButton(android.R.string.ok, null); 
    builder.setMessage("please confirm Contacts access"); 
    builder.setOnDismissListener(new DialogInterface.OnDismissListener() { 
     @Override 
     public void onDismiss(DialogInterface dialog) { 
      // Only call the permission request api on Android M 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
       requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, PERMISSION_REQUEST_CONTACT); 
      } 
     } 
    }); 
    builder.show(); 
} 

Тогда на Android M и выше, только позвоните по необходимости, ниже М, всегда называйте это:

public void askForContactPermission(){ 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     if (ContextCompat.checkSelfPermission(this,Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { 
      if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_CONTACTS)) { 
       showDialog(); 
      } 
     } 
    } else { 
     showDialog(); 
    } 
} 
+0

Спасибо за ваш ответ здесь. Я поставил этот код, но он все равно не запрашивает разрешения. Он не приходит в это условие, если (ContextCompat.checkSelfPermission (this, Manifest.permission.READ_CONTACTS)! = PackageManager.PERMISSION_GRANTED) { –

+0

означает, что вы уже получили это разрешение от пользователя, если хотите проверить его как новый пользователь, откройте настройки вашего телефона приложение> приложения> ваше приложение> разрешения> отключите все разрешения – marmor

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