writeDisplayPhoto() 更改另一个联系人的照片
writeDisplayPhoto() changes the photo of another contact
我正在尝试使用 official android docs here 中的功能设置联系人照片,但该功能将照片更改为完全不同的联系人,尽管我检查了 contactURI
和 contactID
并用它来获取联系人姓名,仍然更改了错误的联系人照片。
测试示例:
选择的联系人 ID: 4673
writeDisplayImage()中关闭rawContactPhotoUri的值:content://com.android.contacts/raw_contacts/4673/display_photo
照片被错误更改的联系人id: 147
我的过程
我select图像,然后select联系人使用startActivityForResult(),然后执行函数
我的代码
onActivityResult() 是:
else if (requestCode == SELECT_CONTACT_FOR_RESULT) {
if (resultCode == RESULT_OK) {
contactUri=data.getData();
setContactImage(contactUri, selectedImageURI, MainActivity.this)
} else {
//}
}
setContactImage()
public static void setContactImage(final Uri rawContactUri, final Uri selectedImageURI, final Activity activity, final boolean isFromShare) {
final String nameString = getContactName(rawContactUri, activity);//get name using URI
final long contactID = ContentUris.parseId(rawContactUri);
if (writeDisplayPhoto(activity, contactID, getByteFromIMGUri(activity, selectedImageURI))) {//success toast }
writeDisplayImage()
private static boolean writeDisplayPhoto(Activity activity, long contactID, byte[] photo) {
Uri rawContactPhotoUri = Uri.withAppendedPath(
ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, contactID),
ContactsContract.RawContacts.DisplayPhoto.CONTENT_DIRECTORY);
Debug.d(activity, "contactID: " + contactID + "rawContactPhotoUri: " + rawContactPhotoUri);
try {
AssetFileDescriptor fd =
activity.getContentResolver().openAssetFileDescriptor(rawContactPhotoUri, "rw");
OutputStream os = fd.createOutputStream();
os.write(photo);
os.close();
fd.close();
return true;
} catch (IOException e) {
Debug.e(activity, "Write Photo EXCEPTION: " + e);
return false;
// Handle error cases.
}
}
getContactName()
static String getContactName(Uri rawContactUri, Context context) {
Cursor cursor; // Cursor object
cursor = context.getContentResolver().query(rawContactUri, null, null, null, null);
cursor.moveToFirst();
int phoneIndex = cursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME);
String string = cursor.getString(phoneIndex);
cursor.close();
Debug.d(context, "Name: " + string + " ,ID: " + ContentUris.parseId(rawContactUri) + " ,URI: " + rawContactUri, false);
return string;
}
您似乎混淆了 Contact ID
和 RawContact ID
。
在ContactsContract中,一个Contact是由多个RawContact组成的。
联系人的 ID 与其 RawContacts 的 ID 不同,并且有可能相同的 ID 将用于一些联系人,但也可能用于一些完全不同的 RawContact(正如您注意到更新了错误的联系人)。
符合以下条件:
setContactImage(contactUri, selectedImageURI, MainActivity.this)
您将 ContactUri(带有 Contact ID)传递给需要 RawContactUri(带有 RawContact ID)的方法。
从 RawContactUri 中获取 ID 并将其错误地称为 contactId 时,您也会遇到一些错误。
这是一些代码,用于从给定的 ContactUri
:
中随机查找 RawContactUri
Uri getSomeRawContactUri(Uri contactUri) {
long contactId = ContentUris.parseId(contactUri);
String[] projection = new String[] { RawContacts._ID };
String selection = RawContacts.CONTACT_ID + " = " + contactId;
Cursor cursor = context.getContentResolver().query(RawContacts.CONTENT_URI, projection, selection, null, null);
if (cursor != null && cursor.moveToFirst()) {
long rawContactId = cursor.getLong(0);
cursor.close();
Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId);
return rawContactUri;
}
return null;
}
我正在尝试使用 official android docs here 中的功能设置联系人照片,但该功能将照片更改为完全不同的联系人,尽管我检查了 contactURI
和 contactID
并用它来获取联系人姓名,仍然更改了错误的联系人照片。
测试示例:
选择的联系人 ID: 4673
writeDisplayImage()中关闭rawContactPhotoUri的值:content://com.android.contacts/raw_contacts/4673/display_photo
照片被错误更改的联系人id: 147
我的过程
我select图像,然后select联系人使用startActivityForResult(),然后执行函数
我的代码
onActivityResult() 是:
else if (requestCode == SELECT_CONTACT_FOR_RESULT) {
if (resultCode == RESULT_OK) {
contactUri=data.getData();
setContactImage(contactUri, selectedImageURI, MainActivity.this)
} else {
//}
}
setContactImage()
public static void setContactImage(final Uri rawContactUri, final Uri selectedImageURI, final Activity activity, final boolean isFromShare) {
final String nameString = getContactName(rawContactUri, activity);//get name using URI
final long contactID = ContentUris.parseId(rawContactUri);
if (writeDisplayPhoto(activity, contactID, getByteFromIMGUri(activity, selectedImageURI))) {//success toast }
writeDisplayImage()
private static boolean writeDisplayPhoto(Activity activity, long contactID, byte[] photo) {
Uri rawContactPhotoUri = Uri.withAppendedPath(
ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, contactID),
ContactsContract.RawContacts.DisplayPhoto.CONTENT_DIRECTORY);
Debug.d(activity, "contactID: " + contactID + "rawContactPhotoUri: " + rawContactPhotoUri);
try {
AssetFileDescriptor fd =
activity.getContentResolver().openAssetFileDescriptor(rawContactPhotoUri, "rw");
OutputStream os = fd.createOutputStream();
os.write(photo);
os.close();
fd.close();
return true;
} catch (IOException e) {
Debug.e(activity, "Write Photo EXCEPTION: " + e);
return false;
// Handle error cases.
}
}
getContactName()
static String getContactName(Uri rawContactUri, Context context) {
Cursor cursor; // Cursor object
cursor = context.getContentResolver().query(rawContactUri, null, null, null, null);
cursor.moveToFirst();
int phoneIndex = cursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME);
String string = cursor.getString(phoneIndex);
cursor.close();
Debug.d(context, "Name: " + string + " ,ID: " + ContentUris.parseId(rawContactUri) + " ,URI: " + rawContactUri, false);
return string;
}
您似乎混淆了 Contact ID
和 RawContact ID
。
在ContactsContract中,一个Contact是由多个RawContact组成的。 联系人的 ID 与其 RawContacts 的 ID 不同,并且有可能相同的 ID 将用于一些联系人,但也可能用于一些完全不同的 RawContact(正如您注意到更新了错误的联系人)。
符合以下条件:
setContactImage(contactUri, selectedImageURI, MainActivity.this)
您将 ContactUri(带有 Contact ID)传递给需要 RawContactUri(带有 RawContact ID)的方法。
从 RawContactUri 中获取 ID 并将其错误地称为 contactId 时,您也会遇到一些错误。
这是一些代码,用于从给定的 ContactUri
:
RawContactUri
Uri getSomeRawContactUri(Uri contactUri) {
long contactId = ContentUris.parseId(contactUri);
String[] projection = new String[] { RawContacts._ID };
String selection = RawContacts.CONTACT_ID + " = " + contactId;
Cursor cursor = context.getContentResolver().query(RawContacts.CONTENT_URI, projection, selection, null, null);
if (cursor != null && cursor.moveToFirst()) {
long rawContactId = cursor.getLong(0);
cursor.close();
Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId);
return rawContactUri;
}
return null;
}