Как добавить контакт с именем и фамилией через намерение - PullRequest
9 голосов
/ 25 сентября 2011

Я пытаюсь запустить действие Android "добавить или изменить контакт" с некоторыми данными, уже имеющимися в форме. Это код, который я использую в настоящее время:

Intent intent = new Intent(Intent.ACTION_INSERT_OR_EDIT);
intent.setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE);

intent.putExtra(Insert.NAME, "A name");
intent.putExtra(Insert.PHONE, "123456789");
startActivity(intent);

Моя проблема в том, что я хотел бы указать имя и фамилию. Я также заметил, что есть класс StructuredName, который содержит постоянные идентификаторы для всех полей, которые мне требуются. К сожалению, мне не удалось добавить поля StructuredName к цели ...

Кто-нибудь знает, как это делается правильно?

Примечание. Я не пытаюсь добавить контакт напрямую, но хочу открыть заполненный диалог «Добавить контакт»!

Спасибо Duh

1 Ответ

2 голосов
/ 30 сентября 2011

Большинство / все значения из ContactsContract.Intents.Insert обрабатываются в классе model/EntityModifier.java в приложении контактов по умолчанию - и это просто вставляет значение из Insert.NAME в StructuredName.GIVEN_NAME.

Вы можете попробовать импортироватьэто как vCard 2.1 (текстовая / x-vcard), которая поддерживает все компоненты имени, но требует, чтобы вы либо сбросили свой файл vCard на SD-карту, либо предоставили что-то, что ContentResolver#openInputStream(Uri) может прочитать (обычно файл на SD-карте или URIуказывая на ваш собственный ContentProvider).

Простой пример использования ContentProvider для динамического создания визитных карточек:

В вашей активности:

Intent i = new Intent(Intent.ACTION_VIEW);
i.setDataAndType(Uri.parse("content://some.authority/N:Jones;Bob\nTEL:123456790\n"), "text/x-vcard");
startActivity(i);

В вашем ContentProvider (зарегистрированномдля полномочий, использованных в намерении ACTION_VIEW):

public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
  try {
    FileOutputStream fos = getContext().openFileOutput("filename.txt", Context.MODE_PRIVATE);
    String vcard = "BEGIN:VCARD\nVERSION:2.1\n" +
        uri.getPath().substring(1) +
        "END:VCARD\n";
    fos.write(vcard.getBytes("UTF-8"));
    fos.close();
    return ParcelFileDescriptor.open(new File(getContext().getFilesDir(), "filename.txt"), ParcelFileDescriptor.MODE_READ_ONLY);
  } catch (IOException e) {
    throw new FileNotFoundException();
  }
}

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

Примечание: Правильное кодирование vCard, конечно, полностью игнорируется.Я представляю большинство версий приложения для контактов , которое должно поддерживать vCard 3.0, которое не имеет такого же тупого кодирования, как vCard 2.1.

С другой стороны, этот метод такжепозволяют добавлять рабочие / мобильные и другие номера (и многое другое).

...