gpt4 book ai didi

android - openContactPhotoInputStream 导致 “java.lang.IllegalStateException: get field slot from row 0 col 0 failed”

转载 作者:行者123 更新时间:2023-11-30 03:11:19 24 4
gpt4 key购买 nike

背景

我正在尝试检查特定联系人的联系人图像是否存在(稍后实际获取它,要晚很多)。查询应尽可能少,并避免不必要的内存使用。

我发现这可能无法通过正常方式实现,所以现在我使用:

final Uri lookupUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, contactKey);
final Cursor contactCur = mContentResolver.query(lookupUri, new String[] { ContactsContract.Contacts._ID },
null, null, null);
if (contactCur == null)
return false;
contactCur.moveToFirst();
long contactId = 0;
if (contactCur.getCount() != 0)
contactId = contactCur.getLong(contactCur.getColumnIndex(ContactsContract.Contacts._ID));
contactCur.close();
if (contactId == 0)
return false;
final Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);

final InputStream inputStream;
if (VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH)
inputStream = ContactsContract.Contacts.openContactPhotoInputStream(mContext.getContentResolver(),
contactUri, bigPicture);
else
inputStream = ContactsContract.Contacts.openContactPhotoInputStream(mContext.getContentResolver(),
contactUri);
if (inputStream != null) {
IOUtils.closeQuietly(inputStream);
return true;
}
return false;

问题

似乎在极少数情况下,设备会返回异常:

java.lang.IllegalStateException: get field slot from row 0 col 0 failed at android.database.CursorWindow.getBlob_native(Native Method) at android.database.CursorWindow.getBlob(CursorWindow.java:288) at android.database.AbstractWindowedCursor.getBlob(AbstractWindowedCursor.java:35) at android.database.CursorWrapper.getBlob(CursorWrapper.java:143) at android.provider.ContactsContract$Contacts.openContactPhotoInputStream(ContactsContract.java:1174)

事实证明,有很多关于此问题的报告,但没有关于“openContactPhotoInputStream”函数的报告。

从我读到的内容(例如 here )来看,这是因为需要读取的 blob 太大,但在这种情况下,我在 Android 的代码中遇到了这个问题......

问题

克服这个问题的最佳方法是什么?

这可能是 Android 上的错误吗?

我的猜测是即使我使用 try-catch ,当我稍后尝试获取图像时我也会得到同样的错误,对吧?

我该如何解决这个问题?

最佳答案

用这样的方法检查照片是否存在(未测试)怎么样:

ContentResolver cr = mContext.getContentResolver();
if (bigPicture && VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH) {
Uri displayPhotoUri = Uri.withAppendedPath(contactUri,
ContactsContract.Contacts.Photo.DISPLAY_PHOTO);
AssetFileDescriptor fd = null;
try {
fd = cr.openAssetFileDescriptor(displayPhotoUri, "r");
} catch (FileNotFoundException e) {}
if (fd != null) {
try {
fd.close();
} catch (IOException e) {
e.printStackTrace();
}
return true;
}
}

Uri photoUri = Uri.withAppendedPath(contactUri,
ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
Cursor cursor = cr.query(photoUri, new String[] {BaseColumns._ID},
ContactsContract.Contacts.Photo.PHOTO + " IS NOT NULL", null, null);
if (cursor == null) {
return false;
}
try {
return cursor.moveToFirst();
} finally {
cursor.close();
}

这里是 openContactPhotoInputStream() 方法的修改版本,它应该能够毫无问题地加载大小接近 1 MB 的照片缩略图(再次未测试):

public static InputStream openContactPhotoInputStream(ContentResolver cr, Uri contactUri,
boolean preferHighres) {
if (preferHighres && VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH) {
Uri displayPhotoUri = Uri.withAppendedPath(contactUri,
ContactsContract.Contacts.Photo.DISPLAY_PHOTO);
try {
return cr.openAssetFileDescriptor(displayPhotoUri, "r").createInputStream();
} catch (IOException e) {}
}
Uri photoUri = Uri.withAppendedPath(contactUri,
ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
try {
return cr.openAssetFileDescriptor(displayPhotoUri, "r").createInputStream();
} catch (IOException e) {}
return null;
}

这应该会导致 ContactsProvider 将缩略图 BLOB 读取到共享内存,并发送指向它的 AssetFileDescriptor,从中我们可以直接打开一个InputStream

关于android - openContactPhotoInputStream 导致 “java.lang.IllegalStateException: get field slot from row 0 col 0 failed”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20932297/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com