Android: установите контактную фотографию с намерением вставки ContactsContract - PullRequest
2 голосов
/ 23 июня 2011

Я использую ContactsContract для вставки нового контакта, отправив пользователя с намерением «Новый контакт». Код, который я использую:

Intent i = new Intent(Intent.ACTION_INSERT);

i.setType(Contacts.CONTENT_TYPE);
i.putExtra(Insert.NAME, "Some Contact Name");
i.putExtra(Insert.EMAIL, "address@email.com");
i.putExtra(Insert.PHONE, "123-456-7890");

startActivity(i);

Однако мне также нужно как-то передать локально сохраненную фотографию (в res / drawable), чтобы показать это намерение «Новый контакт». Я надеялся, что будет простой способ сделать это, например

i.putExtra(Insert.PHOTO, uri_to_photo);

но это, очевидно, не работает. Я нашел эту ветку , в которой подробно описано, как установить фотографию для уже существующего контакта (с помощью метода setPhoto () Яка), но ничего не говорится о том, как передать фотографию, чтобы она отображалась в виде значка контакта на Новый контакт "Намерение.

Как лучше всего передать фотографию (надеюсь, в качестве URI для фотографии) в намерение "Новый контакт"?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 31 января 2019

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

 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 голосов
/ 18 июня 2013

Сначала используйте ContentProviderOperation, чтобы вставить новый контакт.

final ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
        ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
                .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
                .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
                .build());

        Bitmap bmp = YCardImageLoader.getInstance().getBitmapByCache(mTask.getImageUrl());
        if (bmp != null ) {
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            bmp.compress(CompressFormat.JPEG, 100, stream);
            byte[] bytes = stream.toByteArray();

            ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
                    .withValueBackReference(Data.RAW_CONTACT_ID, 0)
                    .withValue(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE)
                    .withValue(Photo.PHOTO, bytes)
                    .build());
        }

        ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
                .withValueBackReference(Data.RAW_CONTACT_ID, 0)
                .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
                .withValue(StructuredName.DISPLAY_NAME, mContact.getName())
                .build());

        ContentProviderResult[] result = SaveToPbkActivity.this.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);

Затем получите результат uri как ACTION_EDIT uri, добавьте другие дополнительные функции startActivityForResult (намерение, REQUEST_INSERT_CONTACT).

        Intent editIntent = new Intent(Intent.ACTION_EDIT);
        uri = result[0].uri;
        editIntent.setDataAndType(uri, Contacts.CONTENT_ITEM_TYPE);
        editIntent.putExtra("finishActivityOnSaveCompleted", true);
        putExtras(editIntent, null);
        startActivityForResult(editIntent, REQUEST_INSERT_CONTACT);

потому что мы вставляем сначала, мы удалим его, когда resultCode! = RESULT_OK

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {    
    if (requestCode == REQUEST_INSERT_CONTACT) {
        if (resultCode == RESULT_OK) {
            //SAVE SUCCESS
        } else {
            ContentResolver cr = getContentResolver();
            cr.delete(uri, null, null);
        }
    } }

Наконец-то извините за мой английский!

...