Невозможно загрузить фотографию контакта в QuickContactBadge для пользовательского экрана входящего вызова
У меня есть пользовательский экран входящего вызова, который отображается при получении входящего вызова. Я смог записать имя и номер абонента из моих контактов и назначить их своим собственным текстовым просмотрам, но получение идентификаторов фотографий контакта оказалось большой болью. Вот код, который должен обрабатывать получение фотографии контакта на основе номера телефона:
int idCol = cur.getColumnIndex(ContactsContract.Contacts._ID);
long contactPhoto = Long.parseLong(IncomingCallListener.getPhoneNumberSt8());
Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactPhoto);
Bitmap bitmap = getDisplayPhoto(contactPhoto);
qcbContactPic.setImageBitmap(bitmap);
cur это курсор.
contactPhoto принимает строку входящего номера телефона, а затем анализирует ее на long.
IncomingCallListener - мой класс для BroadcastReceiver.
qcbContactPic - это QuickContactBadge.
Он компилируется без ошибок, но кто-нибудь знает, почему фотография не будет отображаться в QuickContactBadge при получении входящего вызова?
ПРИМЕЧАНИЕ: я не пытаюсь использовать фотографии Facebook. Я использую фотографии, хранящиеся в галерее телефона, взятые с самого устройства.
ОБНОВЛЕНИЕ ОБНОВЛЕНИЕ ОБНОВЛЕНИЕ
Вот новый код. Предполагается, что это позволяет получить контактную фотографию вызывающего абонента, но он по-прежнему возвращает установленное по умолчанию изображение:
public Uri getPhotoUri() {
try {
Cursor cur = context.getContentResolver().query( //this.
ContactsContract.Data.CONTENT_URI,
null,
ContactsContract.Data.CONTACT_ID + "=" + this.getID() + " 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(IncomingCallListener.getPhoneNumberSt8()));
return Uri.withAppendedPath(person, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
}
public String getID(){
return IncomingCallListener.getPhoneNumberSt8();
}
Тогда это называется так:
Uri u = getPhotoUri();
if (u != null) {
qcbContactPic.setImageURI(u);
Log.d("PHOTO", "ID launched");
} else {
qcbContactPic.setImageResource(R.drawable.ic_launcher);
Log.d("PHOTO", "Default launched");
}
ПРИМЕЧАНИЕ. IncomingCallListener.getPhoneNumberSt8() возвращает строку телефонного номера. Я уже установил номер телефона 5555551234 с фотографией контакта, но когда я звоню из telnet в эмулятор, вместо "Идентификатор запущен" с соответствующей картинкой отображается "По умолчанию запущен".
LOGCAT (все предупреждения, кроме последней записи, показывающей, какая фотография используется):
04-29 05:45:31.581: W/System.err(16332): java.lang.NullPointerException
04-29 05:45:31.590: W/System.err(16332): at com.fooapp.barname.IncomingCallReceived.getPhotoUri(IncomingCallReceived.java:239)
04-29 05:45:31.590: W/System.err(16332): at com.fooapp.barname.IncomingCallReceived.getContactName(IncomingCallReceived.java:225)
04-29 05:45:31.590: W/System.err(16332): at com.fooapp.barname.IncomingCallReceived.onCreate(IncomingCallReceived.java:99)
04-29 05:45:31.590: W/System.err(16332): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
04-29 05:45:31.590: W/System.err(16332): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
04-29 05:45:31.590: W/System.err(16332): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
04-29 05:45:31.590: W/System.err(16332): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
04-29 05:45:31.590: W/System.err(16332): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
04-29 05:45:31.590: W/System.err(16332): at android.os.Handler.dispatchMessage(Handler.java:99)
04-29 05:45:31.600: W/System.err(16332): at android.os.Looper.loop(Looper.java:123)
04-29 05:45:31.600: W/System.err(16332): at android.app.ActivityThread.main(ActivityThread.java:3683)
04-29 05:45:31.600: W/System.err(16332): at java.lang.reflect.Method.invokeNative(Native Method)
04-29 05:45:31.600: W/System.err(16332): at java.lang.reflect.Method.invoke(Method.java:507)
04-29 05:45:31.600: W/System.err(16332): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
04-29 05:45:31.600: W/System.err(16332): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
04-29 05:45:31.600: W/System.err(16332): at dalvik.system.NativeStart.main(Native Method)
04-29 05:45:31.620: D/PHOTO(16332): Default launched
1 ответ
Вот рабочий пример
public class QuickContactBadgeActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//
QuickContactBadge badge = (QuickContactBadge) findViewById(R.id.small_contact_badge);
String contactId = fetchContactIdFromPhoneNumber("123");
Uri uri = getPhotoUri(Long.parseLong(contactId));
badge.assignContactUri(uri);
badge.setImageBitmap(loadContactPhoto(getContentResolver(), Long.parseLong(contactId)));
}
private String fetchContactIdFromPhoneNumber(String phoneNumber) {
Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI,
Uri.encode(phoneNumber));
Cursor cursor = this.getContentResolver().query(uri,
new String[] { PhoneLookup.DISPLAY_NAME, PhoneLookup._ID },
null, null, null);
String contactId = "";
if (cursor.moveToFirst()) {
do {
contactId = cursor.getString(cursor
.getColumnIndex(PhoneLookup._ID));
} while (cursor.moveToNext());
}
return contactId;
}
private static Bitmap loadContactPhoto(ContentResolver cr, long id) {
Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, id);
InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(cr, uri);
if (input == null) {
return null;
}
return BitmapFactory.decodeStream(input);
}
private Uri getPhotoUri(long contactId) {
ContentResolver contentResolver = getContentResolver();
try {
Cursor cursor = contentResolver
.query(ContactsContract.Data.CONTENT_URI,
null,
ContactsContract.Data.CONTACT_ID
+ "="
+ contactId
+ " AND "
+ ContactsContract.Data.MIMETYPE
+ "='"
+ ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE
+ "'", null, null);
if (cursor != null) {
if (!cursor.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, contactId);
return Uri.withAppendedPath(person,
ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
}
}
Пример, на котором он основан:
Как мне загрузить фотографию контакта?
как получить контактный фото URI
Вам также понадобится разрешение:
<uses-permission android:name="android.permission.READ_CONTACTS"/>