Apidemos-->Views-Lists-Cursor(people)-主要用到了获取手机联系人信息,属于内容提供者的范畴,要想了解这方面的内容,可以参考官方docs
/sdk/docs/guide/topics/providers/content-provider-basics.html
这里简单说下contentprovider;
contentprovider可实现不同应用程序之间的数据共享. 它是程序之间进行数据交换的api.
当一个程序需要把自己的数据暴露给其他程序使用时,该应用程序就可以通过提供contentprovider来实现,其他应用程序也可以通过来contentResolver操作contentprovider暴露的数据.
实例中用到了系统提供的联系人contentprovider:
常用的几个Uri有:
ContactsContract.Contacts.CONTENT_URL //管理联系人的URI
ContactsContract.Contacts._ID//联系人Id
ContactsContract.Contacts.DISPLAY_NAME //联系人name 的Uri
ContactsContract.CommonDataKinds.Phone.CONTENT_URI 管理联系的电话的URI
ContactsContract.CommonDataKinds.Email.CONTENT_URI 管理联系人的E-mail的URI
随便写下自己犯了一个超级低级的错误就是.
居然采用for来遍历cursor,把 moveToNext丢了. 还有使用完关闭游标,加上mCursor.close();
package com.example.testmyviewslistscursorpeople; import java.util.ArrayList; import java.util.List; import android.app.ListActivity; import android.content.Context; import android.database.Cursor; import android.net.LocalSocketAddress.Namespace; import android.os.Bundle; import android.provider.ContactsContract.Contacts; import android.provider.ContactsContract.CommonDataKinds.Phone; import android.text.GetChars; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.TextView; import com.example.testmyviewslistsactivateitems.R; /** * * @author Administrator 仿效果slow loading apiDemos -- Views -Lists - Slow Adapter */ public class Main extends ListActivity { private boolean mBusy = false; public static List<String> mStrings = new ArrayList<String>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getPeople(); setListAdapter(new SlowAdapter(this)); // 设置选择模式为单选 getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); // 首次加载设置选中items getListView().setItemChecked(0, true); getListView().setOnScrollListener(new OnScrollListener()); } protected class OnScrollListener implements ListView.OnScrollListener { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { switch (scrollState) { // The view is not scrolling. case OnScrollListener.SCROLL_STATE_IDLE: mBusy = false; int first = view.getFirstVisiblePosition(); int count = view.getChildCount(); for (int i = 0; i < count; i++) { TextView t = (TextView) view.getChildAt(i); if (t.getTag() != null) { t.setText(mStrings.get(first + i)); t.setTag(null); } } break; // The user is scrolling using touch, and their finger is still on // the screen case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL: mBusy = true; break; // The user had previously been scrolling using touch and had // performed a fling. // The animation is now coasting to a stop case OnScrollListener.SCROLL_STATE_FLING: mBusy = true; break; } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } } @Override protected void onListItemClick(ListView l, View v, int position, long id) { getListView().setItemChecked(position, true); } // 自定义适配器 private class SlowAdapter extends BaseAdapter { private LayoutInflater mInflater; public SlowAdapter(Context context) { mInflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { return mStrings.size(); } @Override public Object getItem(int position) { return position; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { TextView text; if (convertView == null) { text = (TextView) mInflater.inflate(R.layout.main, null, false); } else { text = (TextView) convertView; } if (!mBusy) { text.setText(mStrings.get(position).toString()); text.setTag(null); } else { text.setText("Loading..."); text.setTag(this); } return text; } } protected void getPeople() { final String[] CONTACT_PROJECTION = new String[] { Contacts._ID, Contacts.DISPLAY_NAME, }; Cursor mCursor = getContentResolver().query(Contacts.CONTENT_URI, CONTACT_PROJECTION, null, null, null); while(mCursor.moveToNext()) { String name = mCursor.getString(mCursor.getColumnIndex(Contacts.DISPLAY_NAME)); mStrings.add(name); } mCursor.close(); } }
实例源码
增加获取手机联系人电话的方法(只为了解获取方法,尚未和联系人一一对应,后续将改进):
protected void getPeople() { final String[] CONTACT_PROJECTION = new String[] { Contacts._ID, Contacts.DISPLAY_NAME }; //联系人 Cursor mCursor = getContentResolver().query(Contacts.CONTENT_URI, CONTACT_PROJECTION, null, null, null); //联系人电话 Cursor phones = getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID, null, null); while (mCursor.moveToNext()) { // 获取联系人 String name = mCursor.getString(mCursor .getColumnIndex(Contacts.DISPLAY_NAME)); mStrings.add(name); if (phones.moveToNext()) { //获取电话 String phone = phones.getString(phones .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); mStrings.add(phone); } } //关闭资源 mCursor.close(); phones.close(); }