【发布时间】:2014-01-22 19:32:03
【问题描述】:
背景
我正在尝试检查特定联系人的联系人图像是否存在(稍后才能真正获取它,很久以后)。查询应尽可能少,并避免不必要的内存使用。
我发现这可能无法使用正常方式,所以现在我正在使用:
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:从行 0 col 0 获取字段槽 在 android.database.CursorWindow.getBlob_native 失败(本机方法) 在 android.database.CursorWindow.getBlob(CursorWindow.java:288) 在 android.database.AbstractWindowedCursor.getBlob(AbstractWindowedCursor.java:35) 在 android.database.CursorWrapper.getBlob(CursorWrapper.java:143) 在 android.provider.ContactsContract$Contacts.openContactPhotoInputStream(ContactsContract.java:1174)
事实证明,有很多关于这个问题的报告,但没有关于“openContactPhotoInputStream”功能。
从我读到的(例如here),这是因为需要读取的blob太大,但在这种情况下,我在Android的代码中遇到了这个问题......
问题
克服这个问题的最佳方法是什么?
这可能是 Android 上的错误吗?
我的猜测是,即使我使用 try-catch ,当我稍后尝试获取图像时,我也会得到同样的错误,对吧?
我该如何解决这个问题?
【问题讨论】:
标签: android blob android-contacts illegalstateexception