如何将默认图像设置为没有以前图像的 Android 手机联系人
Posted
技术标签:
【中文标题】如何将默认图像设置为没有以前图像的 Android 手机联系人【英文标题】:How to set default image to Android phone contact that has no previous image 【发布时间】:2015-09-03 06:30:39 【问题描述】:我有一段代码可以更新 android 联系人的图像,问题是当联系人没有以前的图像时它不起作用。我还检查了联系人来自“电话”帐户或“*@gmail.com”帐户。当它已经有这些帐户的图像时,我更新图像没有问题,问题只是当联系人没有分配以前的图像时。
这是负责更新图像的方法。
public void update(long id, Bitmap bitmap)
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
// Picture
try
ByteArrayOutputStream image = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG , 100, image);
Builder builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI);
builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI);
builder.withSelection(ContactsContract.Data.CONTACT_ID + "=?" + " AND " + ContactsContract.Data.MIMETYPE + "=?",
new String[]String.valueOf(id), ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE);
builder.withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, image.toByteArray());
ops.add(builder.build());
catch (Exception e)
e.printStackTrace();
try
this.context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
catch (Exception e)
e.printStackTrace();
以下是我如何知道联系人是否属于我上面提到的两个帐户之一:
// Getting the raw contact id
public static int getRawContactId(Context context, long id)
String[] projection = new String[] ContactsContract.RawContacts._ID ;
String selection = ContactsContract.RawContacts.CONTACT_ID + "=?";
String[] selectionArgs = new String[] String.valueOf(id) ;
Cursor c = context.getContentResolver().query(
ContactsContract.RawContacts.CONTENT_URI, projection,
selection, selectionArgs, null);
int rawContactId = -1;
if (c.moveToFirst())
rawContactId = c.getInt(c
.getColumnIndex(ContactsContract.RawContacts._ID));
return rawContactId;
我在这里获取帐户名称以供进一步分析
//...
Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId);
String[] rawProjection = RawContacts._ID, RawContacts.ACCOUNT_NAME ;
Cursor raw = context.getContentResolver().query(rawContactUri, rawProjection, null, null, null);
if (raw.moveToFirst())
account = raw.getString(1);
提前致谢。
【问题讨论】:
【参考方案1】:问题似乎在于,正如您所描述的,您正在更新图像 http://developer.android.com/reference/android/content/ContentProviderOperation.html#newUpdate(android.net.Uri)
而不是插入一个新的 http://developer.android.com/reference/android/content/ContentProviderOperation.html#newInsert(android.net.Uri)
如果联系人没有以前的图像,则无法更新数据库中的字段,因为它不存在。您应该改为执行插入操作。
api 方法是否应该在运行时抛出异常是有争议的。
希望对你有帮助。
【讨论】:
【参考方案2】:按照建议进行一些研究后,我发现了一种效果很好的方法。
https://***.com/a/15145256/2423274
以下是相关部分:
// Create new photo entry
int rawContactId = -1;
Cursor cursor = resolver.query(ContactsContract.RawContacts.CONTENT_URI, null, ContactsContract.RawContacts.CONTACT_ID + "=?", new String[] id, null);
if(cursor.moveToFirst())
rawContactId = cursor.getInt(cursor.getColumnIndex(ContactsContract.RawContacts._ID));
if(rawContactId > -1)
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValue(ContactsContract.Data.RAW_CONTACT_ID, rawContactId)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, photoBytes)
.build());
try
resolver.applyBatch(ContactsContract.AUTHORITY, ops);
catch (Exception e)
e.printStackTrace();
【讨论】:
以上是关于如何将默认图像设置为没有以前图像的 Android 手机联系人的主要内容,如果未能解决你的问题,请参考以下文章
Android Studio - 选项卡式活动如何将片段重置为默认视图?