Contentprovider获取联系人id和姓名
package com.example.contentproviderdemo; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.net.Uri; import android.os.Bundle; import android.provider.ContactsContract; import android.app.Activity; import android.database.Cursor; import android.view.ContextMenu; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ContextMenu.ContextMenuInfo; import android.widget.AdapterView; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.Toast; public class MainActivity extends Activity { private ListView lv; private Cursor cu; private List<Map<String, Object>> list; private SimpleAdapter sa; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lv = (ListView) findViewById(R.id.lv); // 查看所有联系人信息 cu = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); //startManagingCursor(cu); list = new ArrayList<Map<String, Object>>(); while (cu.moveToNext()) { Map<String, Object> map = new HashMap<String, Object>(); // 取出指定名称的数据 map.put("_id", cu.getInt(cu.getColumnIndex(ContactsContract.Contacts._ID))); map.put("name", cu.getString(cu .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME))); list.add(map); } sa = new SimpleAdapter(this, list, R.layout.item_lv, new String[] { "_id", "name" }, new int[] { R.id._id, R.id.name }); lv.setAdapter(sa); // 注册上下文菜单 registerForContextMenu(lv); } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { // TODO Auto-generated method stub super.onCreateContextMenu(menu, v, menuInfo); menu.setHeaderTitle("手机联系人"); menu.add(Menu.NONE, Menu.FIRST + 1, 1, "查看信息"); menu.add(Menu.NONE, Menu.FIRST + 2, 2, "删除"); } @Override public boolean onContextItemSelected(MenuItem item) { // TODO Auto-generated method stub AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item .getMenuInfo(); int postion = info.position; // 获取列表中的id long contractsId = Long.parseLong(list.get(postion).get("_id") .toString()); switch (item.getItemId()) { case Menu.FIRST + 1: // 设置查询的条件 为按id查询 String phoneSelection = ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=?"; // 对条件的完善 String[] phoneSelectArgs = { String.valueOf(contractsId) }; Cursor c =super.getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, phoneSelection, phoneSelectArgs, null); // 用sb对象来接收 StringBuffer sb = new StringBuffer(); sb.append("电话号码是"); while (c.moveToNext()) { sb.append( c.getString(c .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))) .append(","); } Toast.makeText(MainActivity.this, sb, 0).show(); break; case Menu.FIRST + 2: // 删除也是按id来删除 getContentResolver().delete(Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, String.valueOf(contractsId)),null, null); // getContentResolver().delete(url, where, selectionArgs) // 用list中移除 list.remove(postion); // 更新adapter sa.notifyDataSetChanged(); Toast.makeText(MainActivity.this, "数据已经删除", 0).show(); break; } return false; } }
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/LinearLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="手机联系人" /> <ListView android:id="@+id/lv" android:layout_width="fill_parent" android:layout_height="fill_parent" > </ListView> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <TextView android:id="@+id/_id" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
package com.example.contentprovidertest; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.os.Bundle; import android.provider.ContactsContract; import android.app.Activity; import android.content.ContentResolver; import android.database.Cursor; import android.view.Menu; import android.widget.ListView; import android.widget.SimpleAdapter; public class MainActivity extends Activity { private ListView lv; private List<Map<String, Object>> list; private SimpleAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lv = (ListView) findViewById(R.id.lv); ContentResolver resolver = getContentResolver(); //获取姓名和id Cursor cursor = resolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); list = new ArrayList<Map<String, Object>>(); //按id查询的条件 String phoneSelection = ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=?"; while (cursor.moveToNext()) { Map<String, Object> map = new HashMap<String, Object>(); //把name放进map里 map.put("name", cursor.getString(cursor .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME))); //按id查询电话号 Cursor cursor2 = resolver.query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, phoneSelection, new String[] { String.valueOf(cursor.getInt(cursor .getColumnIndex(ContactsContract.Contacts._ID))) }, null); while (cursor2.moveToNext()){ //把电话号放进map里 map.put("phone", cursor2.getString(cursor2 .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))); } list.add(map); } adapter = new SimpleAdapter(this, list, R.layout.item_lv, new String[] { "name", "phone" }, new int[] { R.id.tv_name, R.id.tv_phone }); lv.setAdapter(adapter); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
读取联系人
private ArrayList<HashMap<String, String>> readContact() { // 首先,从raw_contacts中读取联系人的id("contact_id") // 其次, 根据contact_id从data表中查询出相应的电话号码和联系人名称 // 然后,根据mimetype来区分哪个是联系人,哪个是电话号码 Uri rawContactsUri = Uri .parse("content://com.android.contacts/raw_contacts"); Uri dataUri = Uri.parse("content://com.android.contacts/data"); ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>(); // 从raw_contacts中读取联系人的id("contact_id") Cursor rawContactsCursor = getContentResolver().query(rawContactsUri, new String[] { "contact_id" }, null, null, null); if (rawContactsCursor != null) { while (rawContactsCursor.moveToNext()) { String contactId = rawContactsCursor.getString(0); // System.out.println(contactId); // 根据contact_id从data表中查询出相应的电话号码和联系人名称, 实际上查询的是视图view_data Cursor dataCursor = getContentResolver().query(dataUri, new String[] { "data1", "mimetype" }, "contact_id=?", new String[] { contactId }, null); if (dataCursor != null) { HashMap<String, String> map = new HashMap<String, String>(); while (dataCursor.moveToNext()) { String data1 = dataCursor.getString(0); String mimetype = dataCursor.getString(1); // System.out.println(contactId + ";" + data1 + ";" // + mimetype); if ("vnd.android.cursor.item/phone_v2".equals(mimetype)) { map.put("phone", data1); } else if ("vnd.android.cursor.item/name" .equals(mimetype)) { map.put("name", data1); } } list.add(map); dataCursor.close(); } } rawContactsCursor.close(); } return list; }