たくさんのQ&Aスレッドがありますが、どれも本当の答えを提供していないか、私はそれを見つけることができませんでした。
あなたを確実にするために、私は尋ねる前に検索しました:
- Android:ContactsContract挿入インテントで連絡先写真を設定(無効な回答)
- 連絡先をContactsContractを使用してAndroidに挿入します(承認された回答はIntentを使用しません)
- 新しい連絡先インテントを挿入します(問題には触れません)
- コールインテントに写真を挿入するにはどうすればよいですか?(関係ありません)
- 連絡先に写真を追加します(意図を使用しません)
- https://stackoverflow.com/a/8574396/492624(PHOTOフィールドとDATA15フィールドの両方を意図的に試しましたが、機能しない回答からの解決策)
- http://thinkandroid.wordpress.com/2009/12/30/handling-contact-photos-all-api-levels/(インテントを使用しません)
では、(サンプルコードのように)インテントを使用して、ビットマップに保持されている写真を挿入する方法を知っている人はいますか?
私が今使用しているサンプルコードは、ユーザーが保存する前にフィールドを挿入またはキャンセルし、場合によっては編集できるようにするためのダイアログインテントを開始するために使用します。
// PrivateContactClass c;
// Bitmap photo;
Intent inOrUp = new Intent(ContactsContract.Intents.Insert.ACTION, ContactsContract.Contacts.CONTENT_URI);
inOrUp.setType(ContactsContract.Contacts.CONTENT_TYPE);
inOrUp.putExtra(ContactsContract.Intents.Insert.NAME, ModelUtils.formatName(c));
inOrUp.putExtra(ContactsContract.Intents.Insert.PHONE, getPrimaryPhone());
inOrUp.putExtra(ContactsContract.Intents.Insert.TERTIARY_PHONE, c.getMobile());
inOrUp.putExtra(ContactsContract.Intents.Insert.EMAIL, c.getMail());
inOrUp.putExtra(ContactsContract.Intents.Insert.JOB_TITLE, c.getFunction());
inOrUp.putExtra(ContactsContract.Intents.Insert.NOTES, getSummary());
inOrUp.putExtra(ContactsContract.Data.IS_SUPER_PRIMARY, 1);
startActivity(inOrUp);
ジュリアンの答えのおかげで、私は解決策を見つけました
データコンテンツプロバイダーによって保存された画像のIDを渡すことも、ビットマップをインテント内に直接渡すこともできないため、インテントだけを使用するのではありません。
上記のコードから拡張
一定のリクエストコードでstartActivityForResultを使用する
// must be declared in class-context
private static final int CONTACT_SAVE_INTENT_REQUEST = 1;
...
startActivityForResult(inOrUp,CONTACT_SAVE_INTENT_REQUEST);
インテントによって開始されたアクティビティからの処理結果を追加します
@Override
protected void onActivityResult(int requestCode, int resultCode,
Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
switch (requestCode) {
case RESULT_INSERT_CONTACT:
if (resultCode == RESULT_OK) {
trySetPhoto();
}
break;
}
}
写真を設定するメソッドを追加
public boolean setDisplayPhotoByRawContactId(long rawContactId, Bitmap bmp) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
Uri pictureUri = Uri.withAppendedPath(ContentUris.withAppendedId(RawContacts.CONTENT_URI,
rawContactId), RawContacts.DisplayPhoto.CONTENT_DIRECTORY);
try {
AssetFileDescriptor afd = getContentResolver().openAssetFileDescriptor(pictureUri, "rw");
OutputStream os = afd.createOutputStream();
os.write(byteArray);
os.close();
afd.close();
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
連絡先を検索して連絡先の写真を追加するメソッドを追加
private void trySetPhoto() {
// Everything is covered in try-catch, as this method can fail on
// low-memory or few NPE
try {
// We must have an phone identifier by which we search for
// format of phone number is not relevant, as ContentProvider will
// normalize it automatically
if (c.getMobile() != null) {
Uri lookup = Uri.withAppendedPath(
ContactsContract.PhoneLookup.CONTENT_FILTER_URI,
Uri.encode(c.getMobile()));
Cursor c = getContentResolver().query(lookup, null, null, null,
null);
// Remember cursor can be null in some cases
if (c != null) {
// we can obtain bitmap just once
Bitmap photo_bitmap = getPhotoBitmap();
c.moveToFirst();
// if there are multiple raw contacts, we want to set the photo for all of them
while (c.moveToNext()) {
setDisplayPhotoByRawContactId(
c.getLong(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.RAW_CONTACT_ID)),
photo_bitmap);
}
// remember to clean up after using cursor
c.close();
}
}
} catch (Exception e) {
// Logging procedures
} catch (Error e) {
// Logging procedures
}
}