【发布时间】:2013-03-30 12:19:42
【问题描述】:
我无法理解为什么它适用于仿真器,而不是真实的设备。
请帮忙!!!
我通过电话号码获得联系人ID
ContentResolver crFull = context.getContentResolver();
Uri lookupUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(PhoneNumberFormatter.GetOnlyNumbers(((Contact)recipients.get(k)).GetContactPhoneNumber())));
Cursor cursor = crFull.query(lookupUri, new String[] { ContactsContract.PhoneLookup._ID }, null, null, null);
long id = cursor.getLong(cursor.getColumnIndex(ContactsContract.PhoneLookup._ID));
在这里,我将从base64的新图像转换为
String base64Image = json.getString("PhotoBase64");
byte[] decodedString = Base64.decode(base64Image, Base64.DEFAULT);
Bitmap bmp = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
ByteArrayOutputStream streamy = new ByteArrayOutputStream();
bmp.compress(CompressFormat.JPEG, 100, streamy);
byte[] photo = streamy.toByteArray();
在这里我检查是否已联系已有图像
Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, id);
InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(crFull, uri);
如果有
int photoRow = -1;
String where = ContactsContract.Data.RAW_CONTACT_ID + " = " + id + " AND " + ContactsContract.Data.MIMETYPE + " =='" + ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE + "'";
Cursor cursorr = crFull.query(ContactsContract.Data.CONTENT_URI, null, where, null, null);
int idIdx = cursorr.getColumnIndexOrThrow(ContactsContract.Data._ID);
if (cursorr.moveToFirst()) {
photoRow = cursorr.getInt(idIdx);
}
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
.withSelection(ContactsContract.Data._ID + " == " + Integer.toString(photoRow), new String[] {})
.withValue(ContactsContract.Data.RAW_CONTACT_ID, id)
.withValue(ContactsContract.Data.IS_SUPER_PRIMARY, 1)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.Data.DATA15, photo)
.build());
try {
crFull.applyBatch(ContactsContract.AUTHORITY, ops);
} catch (RemoteException e) {
} catch (OperationApplicationException e) {
e.printStackTrace();
}
如果没有
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValue(ContactsContract.Data.RAW_CONTACT_ID, id)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, photo)
.build());
try
{
crFull.applyBatch(ContactsContract.AUTHORITY, ops);
} catch (RemoteException e) {
} catch (OperationApplicationException e) {
e.printStackTrace();
}
更新和插入仅适用于模拟器。如果我在真实设备上启动它,那么没有更新和插入图像。同样在真实设备上我也没有例外。 我做错了什么?
【问题讨论】:
-
究竟是什么问题?你有例外吗?结果是不是和预期的不一样?这些方法都不是(更新以及插入)工作? span>
标签: android contacts android-contentprovider android-contacts android-contentresolver