#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.