权限拒绝异常,即使已向清单添加了正确的权限?

时间:2018-06-21 07:35:58

标签: android permissions securityexception

我正在创建一种从Android手机获取所有姓名和号码的方法。

private void getContactList() {
    Cursor contacts = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
    String aNameFromContacts[] = new String[contacts.getCount()];
    String aNumberFromContacts[] = new String[contacts.getCount()];
    int i = 0;

    int nameFieldColumnIndex = contacts.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
    int numberFieldColumnIndex = contacts.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);

    while(contacts.moveToNext()) {

        String contactName = contacts.getString(nameFieldColumnIndex);
        aNameFromContacts[i] =    contactName ;

        String number = contacts.getString(numberFieldColumnIndex);
        aNumberFromContacts[i] =    number ;
        i++;
    }

    contacts.close();
}

在清单中,我添加了:

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

不幸的是,我仍然遇到异常:

java.lang.SecurityException: Permission Denial: opening provider    com.android.providers.contacts.ContactsProvider2 from ProcessRecord{cb99505 8760:net.zedge.vibtest/u0a80} (pid=8760, uid=10080) requires   android.permission.READ_CONTACTS or android.permission.WRITE_CONTACTS

为什么会这样?

2 个答案:

答案 0 :(得分:2)

在Android Marshmallow之前,在清单中声明权限就足够了,并且系统会在安装过程中授予这些权限。但是从Android M开始,仅声明权限还不够。授予权限的权限已转移给用户。您需要在运行时请求这些权限,以便允许用户授予权限。

请遵循official documentation以获取实施细节。

答案 1 :(得分:1)

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_CONTACTS) == PackageManager.PERMISSION_GRANTED) {
      Cursor contacts = 
          getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, 
          null, null, null);
      String aNameFromContacts[] = new String[contacts.getCount()];
      String aNumberFromContacts[] = new String[contacts.getCount()];
      int i = 0;

      int nameFieldColumnIndex = 
         contacts.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
      int numberFieldColumnIndex = 
         contacts.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);

      while(contacts.moveToNext()) {

          String contactName = contacts.getString(nameFieldColumnIndex);
          aNameFromContacts[i] =    contactName ;

          String number = contacts.getString(numberFieldColumnIndex);
          aNumberFromContacts[i] =    number ;
          i++;
      }

      contacts.close();
}

@Nora尝试这样,将您的代码放入if条件内。现在,您正在检查是否已在设备中启用了联系人权限,如果已启用,则内部代码将被执行,否则不会执行。