2012-10-11 32 views

回答

0

这是不正确的,这是设计。 QuickContactBadge的目的不仅仅是显示一张图片,而且还提供一个界面来提供基于系统已知的现有联系人联系联系人的方法。 “箭头”在那里向用户表明,通过点击图片,他们可以获得更多的信息;它就像一个页面的弯曲角落。

如果您真的只想使用联系人的图片,我相信您需要使用ContactsContract API并自行收集数据。

http://developer.android.com/reference/android/provider/ContactsContract.html

0

这是可能的。使用此代码并将其作为QuickContactBadge导入,而不是导入android QuickContactBadge。

/* 
* Copyright (C) 2009 The Android Open Source Project 
* 
* Licensed under the Apache License, Version 2.0 (the "License"); 
* you may not use this file except in compliance with the License. 
* You may obtain a copy of the License at 
* 
*  http://www.apache.org/licenses/LICENSE-2.0 
* 
* Unless required by applicable law or agreed to in writing, software 
* distributed under the License is distributed on an "AS IS" BASIS, 
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
* See the License for the specific language governing permissions and 
* limitations under the License. 
*/ 


import android.content.AsyncQueryHandler; 
import android.content.ContentResolver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.res.TypedArray; 
import android.database.Cursor; 
import android.graphics.Canvas; 
import android.graphics.drawable.Drawable; 
import android.net.Uri; 
import android.provider.ContactsContract.CommonDataKinds.Email; 
import android.provider.ContactsContract.Contacts; 
import android.provider.ContactsContract.Intents; 
import android.provider.ContactsContract.PhoneLookup; 
import android.provider.ContactsContract.QuickContact; 
import android.provider.ContactsContract.RawContacts; 
import android.util.AttributeSet; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.ImageView; 

/** 
* Widget used to show an image with the standard QuickContact badge 
* and on-click behavior. 
*/ 
public class OverlayLessQuickContactBadge extends ImageView implements OnClickListener { 
    private Uri mContactUri; 
    private String mContactEmail; 
    private String mContactPhone; 
    private Drawable mOverlay; 
    private QueryHandler mQueryHandler; 
    private Drawable mDefaultAvatar; 
    private Context mContext = getContext(); 

    protected String[] mExcludeMimes = null; 

    static final private int TOKEN_EMAIL_LOOKUP = 0; 
    static final private int TOKEN_PHONE_LOOKUP = 1; 
    static final private int TOKEN_EMAIL_LOOKUP_AND_TRIGGER = 2; 
    static final private int TOKEN_PHONE_LOOKUP_AND_TRIGGER = 3; 

    static final String[] EMAIL_LOOKUP_PROJECTION = new String[] { 
     RawContacts.CONTACT_ID, 
     Contacts.LOOKUP_KEY, 
    }; 
    static final int EMAIL_ID_COLUMN_INDEX = 0; 
    static final int EMAIL_LOOKUP_STRING_COLUMN_INDEX = 1; 

    static final String[] PHONE_LOOKUP_PROJECTION = new String[] { 
     PhoneLookup._ID, 
     PhoneLookup.LOOKUP_KEY, 
    }; 
    static final int PHONE_ID_COLUMN_INDEX = 0; 
    static final int PHONE_LOOKUP_STRING_COLUMN_INDEX = 1; 

    public OverlayLessQuickContactBadge(Context context) { 
     this(context, null); 
    } 

    public OverlayLessQuickContactBadge(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

    public OverlayLessQuickContactBadge(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 

     TypedArray styledAttributes = mContext.obtainStyledAttributes(R.styleable.Theme); 


     mQueryHandler = new QueryHandler(mContext.getContentResolver()); 
     setOnClickListener(this); 
    } 



    /** This call has no effect anymore, as there is only one QuickContact mode */ 
    @SuppressWarnings("unused") 
    public void setMode(int size) { 
    } 



    /** True if a contact, an email address or a phone number has been assigned */ 
    private boolean isAssigned() { 
     return mContactUri != null || mContactEmail != null || mContactPhone != null; 
    } 

    /** 
    * Resets the contact photo to the default state. 
    */ 
    public void setImageToDefault() { 
     if (mDefaultAvatar == null) { 
      mDefaultAvatar = getResources().getDrawable(R.drawable.ic_contact_picture); 
     } 
     setImageDrawable(mDefaultAvatar); 
    } 

    /** 
    * Assign the contact uri that this QuickContactBadge should be associated 
    * with. Note that this is only used for displaying the QuickContact window and 
    * won't bind the contact's photo for you. Call {@link #setImageDrawable(Drawable)} to set the 
    * photo. 
    * 
    * @param contactUri Either a {@link Contacts#CONTENT_URI} or 
    *   {@link Contacts#CONTENT_LOOKUP_URI} style URI. 
    */ 
    public void assignContactUri(Uri contactUri) { 
     mContactUri = contactUri; 
     mContactEmail = null; 
     mContactPhone = null; 
     onContactUriChanged(); 
    } 

    /** 
    * Assign a contact based on an email address. This should only be used when 
    * the contact's URI is not available, as an extra query will have to be 
    * performed to lookup the URI based on the email. 
    * 
    * @param emailAddress The email address of the contact. 
    * @param lazyLookup If this is true, the lookup query will not be performed 
    * until this view is clicked. 
    */ 
    public void assignContactFromEmail(String emailAddress, boolean lazyLookup) { 
     mContactEmail = emailAddress; 
     if (!lazyLookup) { 
      mQueryHandler.startQuery(TOKEN_EMAIL_LOOKUP, null, 
        Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, Uri.encode(mContactEmail)), 
        EMAIL_LOOKUP_PROJECTION, null, null, null); 
     } else { 
      mContactUri = null; 
      onContactUriChanged(); 
     } 
    } 

    /** 
    * Assign a contact based on a phone number. This should only be used when 
    * the contact's URI is not available, as an extra query will have to be 
    * performed to lookup the URI based on the phone number. 
    * 
    * @param phoneNumber The phone number of the contact. 
    * @param lazyLookup If this is true, the lookup query will not be performed 
    * until this view is clicked. 
    */ 
    public void assignContactFromPhone(String phoneNumber, boolean lazyLookup) { 
     mContactPhone = phoneNumber; 
     if (!lazyLookup) { 
      mQueryHandler.startQuery(TOKEN_PHONE_LOOKUP, null, 
        Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, mContactPhone), 
        PHONE_LOOKUP_PROJECTION, null, null, null); 
     } else { 
      mContactUri = null; 
      onContactUriChanged(); 
     } 
    } 

    private void onContactUriChanged() { 
     setEnabled(isAssigned()); 
    } 

    @Override 
    public void onClick(View v) { 
     if (mContactUri != null) { 
      QuickContact.showQuickContact(getContext(), OverlayLessQuickContactBadge.this, mContactUri, 
        QuickContact.MODE_LARGE, mExcludeMimes); 
     } else if (mContactEmail != null) { 
      mQueryHandler.startQuery(TOKEN_EMAIL_LOOKUP_AND_TRIGGER, mContactEmail, 
        Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, Uri.encode(mContactEmail)), 
        EMAIL_LOOKUP_PROJECTION, null, null, null); 
     } else if (mContactPhone != null) { 
      mQueryHandler.startQuery(TOKEN_PHONE_LOOKUP_AND_TRIGGER, mContactPhone, 
        Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, mContactPhone), 
        PHONE_LOOKUP_PROJECTION, null, null, null); 
     } else { 
      // If a contact hasn't been assigned, don't react to click. 
      return; 
     } 
    } 

    /** 
    * Set a list of specific MIME-types to exclude and not display. For 
    * example, this can be used to hide the {@link Contacts#CONTENT_ITEM_TYPE} 
    * profile icon. 
    */ 
    public void setExcludeMimes(String[] excludeMimes) { 
     mExcludeMimes = excludeMimes; 
    } 

    private class QueryHandler extends AsyncQueryHandler { 

     public QueryHandler(ContentResolver cr) { 
      super(cr); 
     } 

     @Override 
     protected void onQueryComplete(int token, Object cookie, Cursor cursor) { 
      Uri lookupUri = null; 
      Uri createUri = null; 
      boolean trigger = false; 

      try { 
       switch(token) { 
        case TOKEN_PHONE_LOOKUP_AND_TRIGGER: 
         trigger = true; 
         createUri = Uri.fromParts("tel", (String)cookie, null); 

         //$FALL-THROUGH$ 
        case TOKEN_PHONE_LOOKUP: { 
         if (cursor != null && cursor.moveToFirst()) { 
          long contactId = cursor.getLong(PHONE_ID_COLUMN_INDEX); 
          String lookupKey = cursor.getString(PHONE_LOOKUP_STRING_COLUMN_INDEX); 
          lookupUri = Contacts.getLookupUri(contactId, lookupKey); 
         } 

         break; 
        } 
        case TOKEN_EMAIL_LOOKUP_AND_TRIGGER: 
         trigger = true; 
         createUri = Uri.fromParts("mailto", (String)cookie, null); 

         //$FALL-THROUGH$ 
        case TOKEN_EMAIL_LOOKUP: { 
         if (cursor != null && cursor.moveToFirst()) { 
          long contactId = cursor.getLong(EMAIL_ID_COLUMN_INDEX); 
          String lookupKey = cursor.getString(EMAIL_LOOKUP_STRING_COLUMN_INDEX); 
          lookupUri = Contacts.getLookupUri(contactId, lookupKey); 
         } 
         break; 
        } 
       } 
      } finally { 
       if (cursor != null) { 
        cursor.close(); 
       } 
      } 

      mContactUri = lookupUri; 
      onContactUriChanged(); 

      if (trigger && lookupUri != null) { 
       // Found contact, so trigger QuickContact 
       QuickContact.showQuickContact(getContext(), OverlayLessQuickContactBadge.this, lookupUri, 
         QuickContact.MODE_LARGE, mExcludeMimes); 
      } else if (createUri != null) { 
       // Prompt user to add this person to contacts 
       final Intent intent = new Intent(Intents.SHOW_OR_CREATE_CONTACT, createUri); 
       getContext().startActivity(intent); 
      } 
     } 
    } 
} 
1

这个箭头被称为覆盖和棒棒堂及以上下面是隐藏它最简单的方法:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
    contactBadge.setOverlay(null); 
} 

为了支持预棒棒糖,我延长QuickContactBadge:

/** 
* Extend the QuickContactBadge to hide the overlay. 
*/ 
public class MyQuickContactBadge extends QuickContactBadge { 

    private static final String OVERLAY_FIELD_NAME = "mOverlay"; 

    public MyQuickContactBadge(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     init(); 
    } 

    public MyQuickContactBadge(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    public MyQuickContactBadge(Context context) { 
     super(context); 
     init(); 
    } 

    private void init() { 

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      super.setOverlay(null); 
      return; 
     } 

     try { 
      // Pre-lollipop we use reflection to null the overlay drawable 
      Field overlayField = QuickContactBadge.class.getDeclaredField(OVERLAY_FIELD_NAME); 

      // setAccessible(true) prevents IllegalAccessException 
      overlayField.setAccessible(true); 
      overlayField.set(this, null); 

     } catch (NoSuchFieldException | IllegalAccessException e) { 
      // TODO: log exception 
     } 
    } 
}