2010-03-17 43 views
2

我有以下代码,通过它我可以检索电话号码。不知何故,我无法使用android.provider.Contacts.People API检索电子邮件地址。有任何想法吗?Android:我如何访问Android中的电子邮件地址

import android.app.AlertDialog; 
import android.app.ExpandableListActivity; 
import android.content.ContentUris; 
import android.content.Context; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Bundle; 
import android.provider.Contacts.People; 
import android.view.View; 
import android.widget.ExpandableListAdapter; 
import android.widget.SimpleCursorTreeAdapter; 
import android.widget.TextView; 
import android.widget.ExpandableListView.OnChildClickListener; 

public class ShowContacts extends ExpandableListActivity implements OnChildClickListener { 
    private int mGroupIdColumnIndex; 

    private String mPhoneNumberProjection[] = new String[] { 
      People.Phones._ID, People.NUMBER // CHANGE HERE 
    }; 


    private ExpandableListAdapter mAdapter; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 


     // Query for people 
     Cursor groupCursor = managedQuery(People.CONTENT_URI, 
       new String[] {People._ID, People.NAME}, null, null, null); 

     // Cache the ID column index 
     mGroupIdColumnIndex = groupCursor.getColumnIndexOrThrow(People._ID); 

     // Set up our adapter 
     mAdapter = new MyExpandableListAdapter(groupCursor, 
       this, 
       android.R.layout.simple_expandable_list_item_1, 
       android.R.layout.simple_expandable_list_item_1, 
       new String[] {People.NAME}, // Name for group layouts 
       new int[] {android.R.id.text1}, 
       new String[] {People.NUMBER}, // AND CHANGE HERE 
       new int[] {android.R.id.text1}); 
     setListAdapter(mAdapter); 
    } 

    public class MyExpandableListAdapter extends SimpleCursorTreeAdapter { 

     public MyExpandableListAdapter(Cursor cursor, Context context, int groupLayout, 
       int childLayout, String[] groupFrom, int[] groupTo, String[] childrenFrom, 
       int[] childrenTo) { 
      super(context, cursor, groupLayout, groupFrom, groupTo, childLayout, childrenFrom, 
        childrenTo); 
     } 

     @Override 
     protected Cursor getChildrenCursor(Cursor groupCursor) { 
      // Given the group, we return a cursor for all the children within that group 

      // Return a cursor that points to this contact's phone numbers 
      Uri.Builder builder = People.CONTENT_URI.buildUpon(); 

      ContentUris.appendId(builder, groupCursor.getLong(mGroupIdColumnIndex)); 
      builder.appendEncodedPath(People.Phones.CONTENT_DIRECTORY); 
      Uri phoneNumbersUri = builder.build(); 

      return managedQuery(phoneNumbersUri, mPhoneNumberProjection, null, null, null); 
     } 
    } 

    @Override 
    public boolean onChildClick(android.widget.ExpandableListView parent, 
       View v, int groupPosition, int childPosition, long id) { 
      AlertDialog dialog = new AlertDialog.Builder(ShowContacts.this) 
        .setMessage(((TextView) v).getText().toString()) 
        .setPositiveButton("OK", null).create(); 
      dialog.show(); 
      return true; 
    } 
} 

回答

1

根据CommonsWare的推荐,您应该使用条件类加载来支持这两种模型。无论如何,一个快速和肮脏的解决方案是:

private static final String CONTACT_METHODS_PROJECTION[] = new String[] { 
     Contacts.ContactMethods._ID, 
     Contacts.ContactMethods.DATA 
    }; 

private static final int ID_COLUMN_INDEX = 0; 


@Override 
protected Cursor getChildrenCursor(Cursor groupCursor) { 
    // Given the group, we return a cursor for all the children within that group 

    return managedQuery(Contacts.ContactMethods.CONTENT_URI, CONTACT_METHODS_PROJECTION, 
      ContactMethods.PERSON_ID + "= ? AND " + ContactMethods.KIND + " = " + Contacts.KIND_EMAIL, 
      new String[] { Long.toString(groupCursor.getLong(ID_COLUMN_INDEX)) }, 
      null); 
} 
0

首先,请记住,从Android 2.0开始已弃用android.provider.Contacts。展望未来,您应该使用android.provider.ContactsContract,也许使用条件类加载来支持两种接口一段时间。 See here for a sample project访问电子邮件地址并支持这两个接口。