我正在创建一种从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
为什么会这样?
答案 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条件内。现在,您正在检查是否已在设备中启用了联系人权限,如果已启用,则内部代码将被执行,否则不会执行。