从android联系人select器获取联系信息

我正在尝试拨打联系人select器,将人员姓名,电话和电子邮件转换为string,并使用意向将其发送到其他活动。 到目前为止这工作:

Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); startActivityForResult(intent, 1); // ... @Override public void onActivityResult(int reqCode, int resultCode, Intent data) { super.onActivityResult(reqCode, resultCode, data); if (resultCode == Activity.RESULT_OK) { Uri contactData = data.getData(); Cursor c = managedQuery(contactData, null, null, null, null); if (c.moveToFirst()) { String name = c.getString(c.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME)); Intent intent = new Intent(CurrentActivity.this, NewActivity.class); intent.putExtra("name", name); startActivityForResult(intent, 0); } } } 

但是,如果我join:

 String number = c.getString(c.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER)); 

它迫使closures

也许这是另一种方式来获得他们的号码?

电话号码

电话号码存储在自己的表中,需要单独查询。 要查询电话号码表,请使用存储在SDKvariablesContactsContract.CommonDataKinds.Phone.CONTENT_URI中的URI。 使用WHERE条件获取指定联系人的电话号码。

  if (Integer.parseInt(cur.getString( cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { Cursor pCur = cr.query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{id}, null); while (pCur.moveToNext()) { // Do something with phones } pCur.close(); } 

对Android联系人SQLite数据库执行第二个查询。 电话号码是根据存储在ContactsContract.CommonDataKinds.Phone.CONTENT_URI中的URI来查询的。 联系人ID作为ContactsContract.CommonDataKinds.Phone.CONTACT_ID存储在电话表中,WHERE子句用于限制返回的数据。

电子邮件地址

查询电子邮件地址与电话号码类似。 必须执行查询才能从数据库获取电子邮件地址。 查询存储在ContactsContract.CommonDataKinds.Email.CONTENT_URI中的URI以查询电子邮件地址表。

 Cursor emailCur = cr.query( ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", new String[]{id}, null); while (emailCur.moveToNext()) { // This would allow you get several email addresses // if the email addresses were stored in an array String email = emailCur.getString( emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); String emailType = emailCur.getString( emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE)); } emailCur.close(); 

与电话查询一样,电子邮件表的字段名也存储在ContactsContract.CommonDataKinds下。 电子邮件查询在ContactsContract.CommonDataKinds.Email.CONTENT_URI中的URI上执行,并且WHERE子句必须与ContactsContract.CommonDataKinds.Email.CONTACT_ID字段匹配。 由于可以通过Cursor中返回的logging循环存储多个电子邮件地址。

更多教程在这里

此方法需要Android API版本5或更高版本。

build立在接受的答案上,如果你想跳转到所需的电子邮件地址,而不需要联系人的权限使用这样的事情:

 private static final int REQUEST_CODE_EMAIL = 1; void startSelectingEmail() { Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Email.CONTENT_URI); startActivityForResult(intent, REQUEST_CODE_EMAIL); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK && requestCode == REQUEST_CODE_EMAIL) { Uri emailUri = data.getData(); Cursor emailCursor = getContext().getContentResolver().query(emailUri, null, null, null, null); if (emailCursor != null) { if (emailCursor.moveToFirst()) { String email = emailCursor.getString( emailCursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Email.DATA)); String emailType = emailCursor.getString( emailCursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Email.TYPE)); Log.d(TAG, "Email: " + emailType + " " + email); } emailCursor.close(); } } } 

这不需要联系人权限来读取电子邮件地址,如上面的双重查询方法。 这也使得您不需要为用户编写用户界面来为具有多个电子邮件的联系人select适当的电子邮件地址,用户在联系人应用程序中select特定的电子邮件,因此您只能得到一个结果。

除了电子邮件地址(如显示名称)之外,光标还有相当多的列,不过只有在运行Android M的Nexus 5上才能validation。