所以我一直在搜索Stackoverflow和关于检索联系人照片的Android官方文档,我根本就听不懂。我是Java的新手,所以除了“统一资源标识符”之外,我甚至不了解InputStream的功能或URI是什么。
因此,我只是复制并粘贴了Android文档中的代码,因为我认为它没有办法出错。事实证明,每次我尝试打开照片时,它都会返回null。谷歌肯定确实让联系人变得非常困难。就像简单地重新找回联系人的名字一样,更不用说图片了。
这是一些代码:
openPhoto()函数
private InputStream openPhoto(long contactId) {
Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactId);
Uri photoUri = Uri.withAppendedPath(contactUri, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
Cursor cursor = getContentResolver().query(photoUri,
new String[] {ContactsContract.Contacts.Photo.PHOTO}, null, null, null);
if(cursor == null) {
return null;
}
try {
if(cursor.moveToFirst()) {
byte[] data = cursor.getBlob(0);
if(data != null)
return new ByteArrayInputStream(data);
}
} finally {
cursor.close();
}
return null;
}
照片打开的区域
...
InputStream stream = openPhoto(c.getID());
if(stream != null)
Log.i("PHOTO", stream.toString());
else
Log.i("NULL", "PHOTO IS NULL");
...
在上面的代码中,Logger始终记录“NULL”:“PHOTO IS NULL”。那么,为什么没有在这里找到联系人的照片?
编辑: 如果您有答案,请解释发生了什么。我很感激任何答案,但我想知道发生了什么。到目前为止,这仍未解决。所以如果你有答案,那就解释一下原因。谢谢。
答案 0 :(得分:0)
//返回照片URI
public Uri getPhotoUri(String idContact) {
try {
Cursor cur = this.ctx.getContentResolver().query(
ContactsContract.Data.CONTENT_URI,
null,
ContactsContract.Data.CONTACT_ID + "=" + idContact+ " AND "
+ ContactsContract.Data.MIMETYPE + "='"
+ ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE + "'", null,
null);
if (cur != null) {
if (!cur.moveToFirst()) {
return null; // no photo
}
} else {
return null; // error in cursor process
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
Uri person = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long
.parseLong(getId()));
return Uri.withAppendedPath(person, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
}
//实施
Uri u = objItem.getPhotoUri();
if (u != null) {
mPhotoView.setImageURI(u);
} else {
mPhotoView.setImageResource(R.drawable.ic_contact_picture_2);
}
答案 1 :(得分:0)
使用此功能检索所选联系人的位图图像。
private void retrieveContactPhoto() {
Bitmap photo = null;
InputStream inputStream = null;
try {
inputStream = ContactsContract.Contacts.openContactPhotoInputStream(getContentResolver(),
ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, new Long(contactID)));
if (inputStream != null) {
photo = BitmapFactory.decodeStream(inputStream);
ImageView imageView = (ImageView) findViewById(R.id.img_contact);
imageView.setImageBitmap(photo);
}
} finally {
if (inputStream != null)
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}