android - 无法从联系人中检索电子邮件

标签 android android-intent android-contentprovider android-contacts

我正在编写代码以获取所选联系人的电子邮件,但是当我选择联系人并返回主要 Activity 时,我无法收到电子邮件(未显示 toast )...

public static final int PICK_CONTACT = 1;

public void onclick(View view) {
    Intent intent1 = new Intent(Intent.ACTION_PICK,
            ContactsContract.Contacts.CONTENT_URI);
    startActivityForResult(intent1,PICK_CONTACT);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode==PICK_CONTACT) {
        try {
            if(resultCode==Activity.RESULT_OK) {
                Uri uri=data.getData();
                String[] projection = new String[] {
                    ContactsContract.Contacts._ID,
                    ContactsContract.Contacts.DISPLAY_NAME,
                    ContactsContract.CommonDataKinds.Email.DATA
                };
                Cursor emailCur =
                    getContentResolver().query(uri, null, null, null,null);
                emailCur.moveToFirst();
                String email = emailCur.getString(emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
                String emailType = emailCur.getString(emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));
                Toast.makeText(MainActivity.this,
                        "The email is" +email, Toast.LENGTH_LONG).show();
                emailCur.close();
            }
        }
        catch(Exception e) {
            e.getCause();
        }
    }
}

最佳答案

您需要执行另一个查询来检索电子邮件地址。
检查这个答案(底部关于电子邮件地址的部分),这是同一个问题:get contact info from android contact picker

编辑:代码示例

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
    startActivityForResult(intent, 0);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    // ADD IF STATEMENTS HERE TO CHECK the requestCode, resultCode and data

    Uri contactData = data.getData();
    Cursor c = getContentResolver().query(contactData, null, null, null, null);

    // has result
    if (c.moveToFirst()) {
        String name = c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
        String id = c.getString(c.getColumnIndex(ContactsContract.Contacts._ID));

        // new query for the mail
        Cursor emailCursor = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", new String[]{id}, null);

        // has result
        if(emailCursor.moveToFirst()) {
            String email = emailCursor.getString(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
            String emailType = emailCursor.getString(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));

            Log.d(getClass().getName(), "EMAIL = " + email);
        }

        emailCursor.close();
    }

    c.close();
}

并且不要忘记在 list 中添加 READ_CONTACTS 权限。

关于android - 无法从联系人中检索电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16906281/

相关文章:

Java android Java.io.FileNotFoundException : No content provider:/storage/emulated/0/Android/data

Android - 更改 MX 播放器的标题

java - 在 Android ContentProvider 中从网络同步时防止网络同步循环

java - 为什么我的内容 uri 出现错误?

java - 我的 Java 代码下载了一个文件,但大小错误

android - 如何在Android中实现facebook评论插件

Android自定义控件显示 map 瓦片

android - 在 Android 中打开 Fragments 的动态快捷方式

java - 以字符串形式将联系人作为 vCard 启动 Intent

android - 从手机和 sim Android 读取所有联系人