未经明确许可访问联系信息

时间:2017-02-24 01:12:27

标签: android android-permissions android-contacts

我对应用开发很新。我试图阅读联系信息,而无需请求联系人的许可(所以我使用意图)。

我在主要活动中获得了包含以下代码的URI:

Intent selectContactIntent = new Intent(Intent.ACTION_PICK);
selectContactIntent.setType(ContactsContract.Contacts.CONTENT_TYPE);
if (selectContactIntent.resolveActivity(getPackageManager()) != null) {
    startActivityForResult(selectContactIntent, REQUEST_CODE_SELECT_CONTACT);
}
else {
    showContactRequiredMessage(view);
}

在另一个(子)活动中,我执行以下操作:

contactUri = intent.getParcelableExtra(MainActivity.CONTACT_URI);

String[] projection = new String[] {
        ContactsContract.Contacts.Data._ID,
        ContactsContract.Contacts.Data.MIMETYPE,
        ContactsContract.Contacts.Data.DATA1,
        ContactsContract.Contacts.Data.DATA2,
        ContactsContract.Contacts.Data.DATA3,
        ContactsContract.Contacts.Data.DATA4,
        ContactsContract.Contacts.Data.DATA5,
        ContactsContract.Contacts.Data.DATA6,
        ContactsContract.Contacts.Data.DATA7,
        ContactsContract.Contacts.Data.DATA8,
        ContactsContract.Contacts.Data.DATA9,
        ContactsContract.Contacts.Data.DATA10,
        ContactsContract.Contacts.Data.DATA11,
        ContactsContract.Contacts.Data.DATA12,
        ContactsContract.Contacts.Data.DATA13,
        ContactsContract.Contacts.Data.DATA14,
        ContactsContract.Contacts.Data.DATA15
};
Cursor contactResults = getContentResolver().query(contactUri, projection, null, null, null);

最后一行抛出异常java.lang.IllegalArgumentException: Invalid column <any column after _ID>

我的应用程序并不需要现实中的所有数据我只想查看可用的内容,我很可能需要名字,姓氏,电话和电子邮件。

1 个答案:

答案 0 :(得分:0)

正如我对您的回答的评论中所述,您应该能够在不使用CONTENT_TYPE等特定CommonDataKinds.Phone.CONTENT_TYPE的情况下获得所需信息。

我在您的代码中看到的问题是您尝试从Data表uri访问Contacts表信息。

ContactsContract api在3个主表上存储了信息:Contacts,RawContacts和Data。 您获得了一个contactUri,它指向Contacts表中的条目,使用以下代码读取与该联系人相关的数据条目:

long contactId = ContentUris.parseId(contactUri);
String projection = String[] { Data.MIMETYPE, Data.DISPLAY_NAME, Data.DATA1 };
String selection = Data.CONTACT_ID + " = " + contactId;
Cursor cursor = getContentResolver().query(Data.CONTENT_URI, projection, selection, null, null);

while (cursor != null && cursor.moveToNext()) {
  String mime = cursor.getString(0);
  String name = cursor.getString(1);
  String info = cursor.getString(2);
  if (mime.equals(CommonDataKinds.Email.CONTENT_ITEM_TYPE)) {
     Log.d(TAG, name + ": email = " + info;
  }
  if (mime.equals(CommonDataKinds.Phone.CONTENT_ITEM_TYPE)) {
     Log.d(TAG, name + ": phone = " + info;
  }
  // Add more mimetypes here if needed...
}
if (cursor != null) {
  cursor.close();
}