从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。