Как использовать SHOW_OR_CREATE_CONTACT, а также установить фотографию для контакта?

1

Задний план

Я знаю, что есть различные поля, которые могут быть установлены с помощью этого намерения, такие как адрес, номера телефонов, имя и т.д.:

final Intent intent = new Intent(ContactsContract.Intents.SHOW_OR_CREATE_CONTACT, Uri.parse("tel:" +PhoneNumberService.formatNumber(phoneNumber, PhoneNumberFormat.NATIONAL));
intent.putExtra(ContactsContract.Intents.Insert.NAME, name);
intent.putExtra(ContactsContract.Intents.Insert.POSTAL_ISPRIMARY,address);
intent.putExtra(ContactsContract.Intents.Insert.POSTAL,address);
... //other stuff, like on this post: http://stackoverflow.com/q/3456319/878126

Проблема

Я хотел бы узнать, можно ли добавить фотографию.

Что я пробовал

Я пробовал следующий код, но он не работает:

public static byte[] toByteArray(final Bitmap bitmap) {
    if (bitmap == null || bitmap.isRecycled())
        return null;
    final ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
    final byte[] byteArray = stream.toByteArray();
    return byteArray;
}


final byte[] imageByteArray = toByteArray(mBitmap);
intent.putExtra(ContactsContract.CommonDataKinds.Photo.PHOTO, imageByteArray);

Вопрос

Можно ли поставить фотографию тоже? Если да, то как?

Я также попытался выяснить, выполнено ли добавление, чтобы я мог получить контакт-ключ и иметь возможность изменять его, если мне нужно, но похоже, что "startActivityForResult" здесь не помогает.

Теги:
android-bitmap
android-intent
android-contacts

3 ответа

1
Лучший ответ

Короткий ответ

Нет.

Цель SHOW_OR_CREATE_CONTACT запускает ShowOrCreateActivity. И из документации:

Любые дополнительные функции из класса ContactsContract.Intents.Insert будут переданы в действие create, если нет контактов для показа.

Поэтому ContactsContract.Intents.Insert.POSTAL должен работать, но на самом деле нет причин, по которым ContactsContract.CommonDataKinds.Photo может работать.

Длительный ответ

Из кода предыдущая операция выполняет поиск контакта по телефону, если Uri является tel: или электронной почтой, если это mailto: и если ни один не найден, запрашивает пользователя, а положительная кнопка запускает createIntent.

            final Intent createIntent = new Intent(Intent.ACTION_INSERT_OR_EDIT);
            createIntent.putExtras(mCreateExtras);
            createIntent.setType(RawContacts.CONTENT_ITEM_TYPE);

где mCreateExtras содержит все дополнительные функции, которые вы передали SHOW_OR_CREATE_CONTACT (см. onCreate)

Согласно AndroidManifest, это запускает ContactEditorActivity который настраивает панель инструментов и помещает ContactEditorFragement.

Поездка почти закончилась. Связывание данных выполняется в bindEditorsForNewContact() и кажется ограниченным тем, что предоставляет RawContactModifier.parseExtras(). Документация кажется правильной.

Временное решение

Однако есть другой способ вставить контакт непосредственно с поставщиком контента.

 ContentValues values = new ContentValues();
 values.put(RawContacts.ACCOUNT_TYPE, accountType);
 values.put(RawContacts.ACCOUNT_NAME, accountName);
 // This may work (not tested)
 values.put(ContactsContract.CommonDataKinds.Photo.PHOTO, imageByteArray);
 Uri rawContactUri = getContentResolver().insert(ContactsContract.CONTENT_URI, values);
 long rawContactId = ContentUris.parseId(rawContactUri);

Итак, что вы можете сделать:

  1. Помогите пользователю создать контакт, запустив SHOW_OR_CREATE_CONTACT
  2. После того, как контакт создан, вставьте фотографию для этого контакта.
  • 0
    так нельзя, правда? Что вы предлагаете, так это кодировать часть помещения всех данных в контакт и, возможно, даже создать пользовательский интерфейс для пользователя, что означает замену встроенного действия, которое им занимается. Я не понимаю второе решение, которое вы предложили.
  • 0
    Я не уверен, каков ваш вариант использования. Если вы хотите помочь пользователю создать контакт, то в качестве обходного пути можно было бы сначала создать контакт без отображаемого изображения и добавить отображаемое изображение после его создания.
Показать ещё 6 комментариев
0

Попробуйте этот код, чтобы добавить изображение с контактной информацией, используя намерение

 var bit = BitmapFactory.decodeResource(getResources(), R.drawable.yourimagename); // your image
    val data = ArrayList<ContentValues>();
    var row = ContentValues();
    row.put(ContactsContract.Contacts.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE);
    val stream = ByteArrayOutputStream()
    bit.compress(Bitmap.CompressFormat.PNG, 100, stream)
    val byteArray = stream.toByteArray()
    bit.recycle()
    row.put(ContactsContract.CommonDataKinds.Photo.PHOTO, byteArray);
    data.add(row)
    var intent = Intent(Intent.ACTION_INSERT, ContactsContract.Contacts.CONTENT_URI);
    intent.putParcelableArrayListExtra(ContactsContract.Intents.Insert.DATA, data);
    intent.putExtra(ContactsContract.Intents.Insert.NAME, name);
    intent.putExtra(ContactsContract.Intents.Insert.PHONE, phone1);
    intent.putExtra(ContactsContract.Intents.Insert.SECONDARY_PHONE, phone2);
    intent.putExtra(ContactsContract.Intents.Insert.EMAIL, email);
    context.startActivity(intent);
0

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

Из документации новые контактные вставки не могут быть созданы явно. Это означает, что новые контактные данные необходимо вставить с использованием URI и значений (неявно).

Единственный возможный способ - создать новый контакт с помощью поставщика контента и добавить все поля, включая изображение по умолчанию. Затем сразу же после этого используйте ACTION_EDIT, чтобы пользователь мог редактировать поля.

Смотрите также в Intents.ATTACH_IMAGE

  • 0
    Это то, что я сделал в конце концов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню