Android выбирает намерение электронной почты

Я хочу выбрать адрес электронной почты из списка контактов. Выбор контакта недостаточно хорош, потому что у контакта может быть несколько адресов электронной почты.

Используя демонстрацию 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);

Я получаю исключение активности не найдено.

Любая идея о том, как выбрать электронную почту из всех электронных писем контактов?

Спасибо. Алик.

Обновление (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);

person AlikElzin-kilaka    schedule 02.05.2011    source источник
comment
Вы нашли решение этой проблемы? Создание пользовательского диалога, как предполагают ответы, является очень уродливым решением.   -  person Thrakbad    schedule 24.06.2013


Ответы (5)


Я специально не пытался использовать средство выбора, но мы просматриваем наш кеш контактов и находим все контактные данные с типом 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();
person Dan J    schedule 25.10.2011

вы должны использовать следующую константу (не CONTENT_ITEM_TYPE):

intent.setType(ContactsContract.CommonDataKinds.Email.CONTENT_TYPE);
person rpaulin56    schedule 29.10.2013

Отлично работает:

 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);
            }


        }
}
person Shubham    schedule 01.05.2015

Вот пример фрагмента кода, отображающего все адреса электронной почты в списке контактов для пользователя и позволяющего им выбрать один (который затем помещается в EditText с идентификатором R.id.youredittextid ).

Примечание. Это довольно неэффективный способ сделать это и вызовет значительную задержку, если у вас много контактов. Но весь необходимый код здесь; настраивай как считаешь нужным...

        // 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(); 
person Jeff Hay    schedule 22.12.2011

Тема старая, но... эта информация может кому-нибудь пригодиться. Когда вы запускаете Intent с Intent.ACTION_PICK, вы пытаетесь вызвать действие «Выбор контактов», которое обычно предоставляется приложением «Контакты/телефонная книга».

Последняя версия приложения Vanilla (Google) Contacts (Android 4.4.4) имеет Email.CONTENT_ITEM_TYPE для mimetype в своем фильтре намерений, поэтому оно должно реагировать на такое намерение, как вы это сделали. Я не уверен, но кажется, что средство выбора контактов для более старых версий (ICS, JB) не имело этого в своих фильтрах намерений.

Короче говоря, это намерение должно работать на KK с установленными ванильными контактами и не должно работать на более старых версиях Android.

person pizon    schedule 14.08.2014