0

現在、着信の名前と電話番号を表示できるカスタムの着信画面があります。連絡先に (自分の電話で) プロフィール写真が設定されている場合、その画像は作成した ImageView に表示されます。電話にない番号には Android アイコンが表示されます。

コードをテストした後、電話番号が電話 (エミュレーター) に保存されているかどうかに関係なく、Android アイコンが表示されます。発信者の連絡先写真が利用可能な場合に、それを取得するコードは次のとおりです。

public Uri getPhotoUri(long contactId) { //contactId takes the phone number.

    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);
  }

このメソッドは上記のメソッドを呼び出し、画像を ImageView に割り当てます。問題は、else ステートメントが常に実行されることです。

IncomingCallListener.getId(getID))); は、対応するプロフィール写真を取得するために使用される実際の電話番号です。

public void showContactPhoto(){

    Uri u = getPhotoUri(IncomingCallListener.getId(getID()));
    if (u != null) {    
        qcbContactPic.setImageURI(u);
        Log.d("PHOTO", "ID launched");
    } else {
        qcbContactPic.setImageResource(R.drawable.ic_launcher);
        Log.d("PHOTO", "Default launched");
    }
}

「u」がnullのままである理由について誰か考えがありますか?

注: 連絡先の画像は、メディア ギャラリーに保存されます。

4

1 に答える 1

0

これを試して

Uri uri = ContentUris.withAppendedId(
                    ContactsContract.Contacts.CONTENT_URI, longId);
            ContentResolver cr = getContentResolver();
            InputStream input = ContactsContract.Contacts
                    .openContactPhotoInputStream(cr, uri);
            if (input == null) {
                return null;
            } else
                return BitmapFactory.decodeStream(input);

ImageViewのsetImageBitmap()メソッドを使用します。

于 2012-04-29T11:30:02.583 に答える