安卓选择电子邮件意图

10
我想从联系人列表中选择一个电子邮件地址。 仅仅选择联系人还不够,因为一个联系人可能会有多个电子邮件地址。
使用API演示代码,我成功地选择了一个联系人,电话号码甚至地址。例如:
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE);
// OR
intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
// OR
intent.setType(ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE);

但是,当尝试选择电子邮件时

intent.setType(ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE);

我收到了“ActivityNotFoundException”异常。

有没有办法从所有联系人的电子邮件中选择一个电子邮件?

谢谢。 Alik。

更新(2011/05/02): 找到了另一种从联系人中选择内容的方法,但是电子邮件选择器尚未注册到意图中。

正在工作:

new Intent(Intent.ACTION_PICK,ContactsContract.Contacts.CONTENT_URI);
new Intent(Intent.ACTION_PICK,ContactsContract.CommonDataKinds.Phone.CONTENT_URI);
new Intent(Intent.ACTION_PICK,ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI);

无法工作:

new Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Email.CONTENT_URI);

1
你找到解决方案了吗?像答案中建议的构建自定义对话框是一个非常丑陋的解决方案。 - Thrakbad
5个回答

1

完美运作:

 Intent intent = new Intent(Intent.ACTION_PICK);
 intent.setType(ContactsContract.CommonDataKinds.Email.CONTENT_TYPE);
 startActivityForResult(intent, 1);

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 1) {
            if (resultCode == Activity.RESULT_OK) {
                Uri contactData = data.getData();
                Cursor cursor = getActivity().managedQuery(contactData, null, null, null, null);
                cursor.moveToFirst();
                String email = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER));
                editText.setText(email);
            }


        }
}

1

我没有特别尝试使用选择器,但我们会遍历联系人缓存并找到所有 MIME 类型为 Email.CONTENT_ITEM_TYPE 的联系人详细信息。

然后,我们构建一个对话框,让用户选择要使用的电子邮件地址,并将该电子邮件地址传递给用户的电子邮件应用程序,例如:

  final Intent emailIntent = new Intent(Intent.ACTION_SEND);
  emailIntent.putExtra(Intent.EXTRA_STREAM, "Some text");

  Builder builder = new Builder(this);
  builder.setTitle("Choose email");
  builder.setItems(emailAddressesArray, new DialogInterface.OnClickListener()
  {
    @Override
    public void onClick(DialogInterface dialog, int which)
    {
      String address = emailAddresses.get(emailAddressesArray[which]);
      sLog.user("User selected e-mail: " + address);
      emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{address});
      startExternalActivity(emailIntent);
    }
  });
  builder.show();

1

你需要使用以下常量(而不是CONTENT_ITEM_TYPE):

intent.setType(ContactsContract.CommonDataKinds.Email.CONTENT_TYPE);

0

以下是一个示例代码,用于向用户显示通讯录中的所有电子邮件地址,并允许他们选择单个电子邮件地址(然后将其放入ID为R.id.youredittextidEditText中)。

注意:这种方法效率较低,如果您有很多联系人,可能会导致相当大的延迟。但是所有必要的代码都在这里;根据需要进行自定义...

        // We're going to make up an array of email addresses
        final ArrayList<HashMap<String, String>> addresses = new ArrayList<HashMap<String, String>>();

        // Step through every contact
        final ContentResolver cr = getContentResolver();
        final Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
        while (cursor.moveToNext())
        {
            final String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
            final String contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

            // Pull out every email address for this particular contact
            final Cursor emails = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, 
                                            ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + contactId, null, null);
            while (emails.moveToNext()) 
            {
                // Add email address to our array
                final String strEmail = emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));

                final HashMap<String, String> email = new HashMap<String, String>();
                email.put("Name", contactName);
                email.put("Email", strEmail);

                addresses.add(email);
            }
            emails.close();
        }

        // Make an adapter to display the list
        SimpleAdapter adapter = new SimpleAdapter(this, addresses, android.R.layout.two_line_list_item,
                                                    new String[] { "Name", "Email" },
                                                    new int[] { android.R.id.text1, android.R.id.text2 });

        // Show the list and let the user pick an email address
        new AlertDialog.Builder(this)
          .setTitle("Select Recipient")
          .setAdapter(adapter, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {

                EditText e = (EditText)findViewById(R.id.youredittextid);
                HashMap<String, String> email = addresses.get(which);
                e.setText(email.get("Email"));

              dialog.dismiss();
            }
          }).create().show(); 

0

虽然这是一个旧的帖子,但是这些信息对某些人可能会有用。

当您使用Intent.ACTION_PICK启动一个Intent时,您正在尝试调用“联系人选择器”活动,该活动通常由联系人/电话簿应用程序提供。

最新版本的原生(Google)联系人应用程序(Android 4.4.4)确实在其意图过滤器中具有Email.CONTENT_ITEM_TYPE的MIME类型,因此它应该响应此类意图,就像您所做的那样。我不确定,但似乎旧版本(ICS,JB)的联系人选择器没有在其意图过滤器中添加此内容。

简而言之,在安装了原生联系人的KK上,此意图应该可以工作,在旧版Android上则不应该工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接