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

#android #email #android-intent #contacts

#Android #Адрес электронной почты #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);
  

Я получаю исключение activity not found.

Есть идеи о том, как выбрать электронное письмо из всех электронных писем контактов?

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

Обновление (2011/05/02): найден другой способ выбора данных из контактов, но средство выбора электронной почты по-прежнему не зарегистрировано в intent.

Работает:

 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. Вы нашли решение для этого? Создание пользовательского диалогового окна, как предполагают ответы, является очень уродливым решением.

Ответ №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();
  

Ответ №2:

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

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

Ответ №3:

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

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


        }
}
  

Ответ №4:

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

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

         // 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(); 
  

Ответ №5:

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

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

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