我的应用程序中有一个代码可以获取联系人的 URI,然后通过尝试打开照片的输入流来验证联系人是否有照片,获取照片的 URI 并对其进行解码。
很少,我得到一个奇怪的异常,即 URI 不存在。我得到一个不存在的照片文件的 URI。
获取照片 URI:
// Get Uri to the contact
Uri contact = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI,
c.getInt(c.getColumnIndex(PhoneLookup._ID)));
// Get input stream of the photo
InputStream is = Contacts.openContactPhotoInputStream(context.getContentResolver(), contact);
// If no input stream (then there is no photo of contact), return 'null' instead of photo Uri
if (is == null) {
Log.d(TAG, "No photo");
return;
}
// Get display photo Uri of the contact
Uri photoUri = Uri.withAppendedPath(contact, ContactsContract.Contacts.Photo.DISPLAY_PHOTO);
此时,当一个联系人没有照片时,is
获取null
并返回。但很少,photoUri
得到content://com.android.contacts/contacts/303/display_photo
。
现在对其进行解码(在其他功能中):
InputStream isPhoto = context.getContentResolver().openInputStream(photoUri);
从这一行抛出的异常是:
java.io.FileNotFoundException: No photo file found for ID 0
at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:146)
at android.content.ContentProviderProxy.openTypedAssetFile(ContentProviderNative.java:617)
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:717)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:614)
at android.content.ContentResolver.openInputStream(ContentResolver.java:449)
at com.app.android.utils.ImageUtils.decodeBitmapFromPhotoUri(ImageUtils.java:39)
...
内容解析器怎么可能给我一张不存在的照片的URI(联系人存在并且肯定没有照片)而不是返回null
?
更新:我看到它只发生在不是由设备拍摄的照片上(比如从谷歌帐户收到的照片或从互联网下载的照片)。