1 用隱式Intent獲取聯系人
第一步、在需要讀取或者修改聯系人信息的前要在manifests文件下聲明讀寫權限,否則在后續的調用中會出錯
<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission> 第二步采用ACTION_PICK為動作聲明一個隱式Intent。
bt_main_button = (Button) findViewById(R.id.bt_main_button); bt_main_button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); //聲明隱式Intent,從聯系人中獲取一個返回信息 startActivityForResult(i,RESULT_CANCELED); } });第三步、在onActivityResult中獲取返回的URI,該URI是指向用戶所選的聯系人的定位符,通過該URI可以查詢聯系人數據庫從而提取出聯系人id與姓名。而通過聯系人id可以進一步在數據庫中提取出聯系人的電話。其中聯系人名字和id要在ContactsContract.Contacts中獲取,而電話則ContactsContract.CommonDataKinds.Phone中獲取。
@Override PRotected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == RESULT_CANCELED){ Uri contactUri = data.getData(); //該數據URI是一個指向用戶所選聯系人的定位符 Cursor c =getContentResolver().query(contactUri, null, null, null, null); //查詢聯系人數據庫,獲得一個可用的Cursor if(c.moveToFirst()) { //將Cursor移動到第一條記錄 String suspect = c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); //通過Cursor c獲得聯系人名字 String id = c.getString(c.getColumnIndex(ContactsContract.Contacts._ID)); //通過Cursor c獲得聯系人id Cursor c2 =getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + id, null, null); //在ContactsContract.CommonDataKinds.Phone.CONTENT_URI里, // 通過上面獲得的聯系人id獲得一個新的Cursor c2 c2.moveToFirst(); String phonenum = c2.getString(c2.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); //通過Cursor c2獲得聯系人電 //給控件賦值 tv_main_view.setText(suspect+" "+phonenum); c2.close(); //關閉Cursor c2 c.close(); //關閉Cursor c } } }2 通過ContentProvider得到手機上所有聯系人的信息
第一步 在manifests文件下聲明讀寫權限 與隱式intent一樣的
<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission> 第二步 得到內容訪問者ContentResolver cr=getContentResolver(); 第三步 得到手機中所有的聯系人的信息并展示在listview中
List<String> namelist=new ArrayList<>(); List<String> tellist=new ArrayList<>(); //ContentProvider得到所有聯系的信息 public void getContacts(View view){ //獲取聯系人 Uri uri=Uri.parse("content://com.android.contacts/raw_contacts"); Cursor cursor= cr.query(uri,null,null,null,null); while(cursor.moveToNext()){ //得到聯系人是id int id=cursor.getInt(cursor.getColumnIndex("_id")); String name=cursor.getString(cursor.getColumnIndex("display_name")); // Log.i("text", "getContacts: "+id+name); //獲取相對應的聯系人的數據(電話號碼) Uri uriData=Uri.parse("content://com.android.contacts/raw_contacts/"+id+"/data"); Cursor cursorData=cr.query(uriData,null,null,null,null); while (cursorData.moveToNext()){ String data1=cursorData.getString(cursorData.getColumnIndex("data1")); //int type=cursorData.getInt(cursorData.getColumnIndex("mimetype_id")); //得到數據的類型(郵件地址,電話號碼等等)這里我們只需得到電話號碼 String type=cursorData.getString(cursorData.getColumnIndex("mimetype")); if("vnd.android.cursor.item/phone_v2".equals(type)){ namelist.add(name); tellist.add(data1); } } } List<Map<String,Object>> date=new ArrayList<>(); for (int i = 0; i <namelist.size() ; i++) { Map<String,Object> map=new HashMap<>(); map.put("name",namelist.get(i)); map.put("tel",tellist.get(i)); date.add(map); } SimpleAdapter adpater=new SimpleAdapter(this,date,R.layout.item_list,new String[]{"name","tel"},new int[]{R.id.tv_list_name,R.id.tv_list_apont} ); lv_main_view.setAdapter(adpater); lv_main_view.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { tv_main_view.setText(namelist.get(position)+" "+tellist.get(position)); } }); }兩種方式結合源代碼:java代碼:
import android.content.ContentResolver;import android.content.Intent;import android.net.Uri;import android.provider.ContactsContract;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.database.Cursor;import android.widget.Adapter;import android.widget.AdapterView;import android.widget.Button;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.TextView;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;public class MainActivity extends AppCompatActivity { private ContentResolver cr; List<String> namelist=new ArrayList<>(); List<String> tellist=new ArrayList<>(); private ListView lv_main_view; private TextView tv_main_view; private Button bt_main_button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lv_main_view = (ListView) findViewById(R.id.lv_main_view); tv_main_view = (TextView) findViewById(R.id.tv_main_view); bt_main_button = (Button) findViewById(R.id.bt_main_button); bt_main_button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); //聲明隱式Intent,從聯系人中獲取一個返回信息 startActivityForResult(i,RESULT_CANCELED); } }); cr = getContentResolver(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == RESULT_CANCELED){ Uri contactUri = data.getData(); //該數據URI是一個指向用戶所選聯系人的定位符 Cursor c =getContentResolver().query(contactUri, null, null, null, null); //查詢聯系人數據庫,獲得一個可用的Cursor if(c.moveToFirst()) { //將Cursor移動到第一條記錄 String suspect = c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); //通過Cursor c獲得聯系人名字 String id = c.getString(c.getColumnIndex(ContactsContract.Contacts._ID)); //通過Cursor c獲得聯系人id Cursor c2 =getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + id, null, null); //在ContactsContract.CommonDataKinds.Phone.CONTENT_URI里, // 通過上面獲得的聯系人id獲得一個新的Cursor c2 c2.moveToFirst(); String phonenum = c2.getString(c2.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); //通過Cursor c2獲得聯系人電 //給控件賦值 tv_main_view.setText(suspect+" "+phonenum); c2.close(); //關閉Cursor c2 c.close(); //關閉Cursor c } } } public void getContacts(View view){ //獲取聯系人 Uri uri=Uri.parse("content://com.android.contacts/raw_contacts"); Cursor cursor= cr.query(uri,null,null,null,null); while(cursor.moveToNext()){ //得到聯系人是id int id=cursor.getInt(cursor.getColumnIndex("_id")); String name=cursor.getString(cursor.getColumnIndex("display_name")); // Log.i("text", "getContacts: "+id+name); //獲取相對應的聯系人的數據(電話號碼) Uri uriData=Uri.parse("content://com.android.contacts/raw_contacts/"+id+"/data"); Cursor cursorData=cr.query(uriData,null,null,null,null); while (cursorData.moveToNext()){ String data1=cursorData.getString(cursorData.getColumnIndex("data1")); //int type=cursorData.getInt(cursorData.getColumnIndex("mimetype_id")); //得到數據的類型(郵件地址,電話號碼等等)這里我們只需得到電話號碼 String type=cursorData.getString(cursorData.getColumnIndex("mimetype")); if("vnd.android.cursor.item/phone_v2".equals(type)){ namelist.add(name); tellist.add(data1); } } } List<Map<String,Object>> date=new ArrayList<>(); for (int i = 0; i <namelist.size() ; i++) { Map<String,Object> map=new HashMap<>(); map.put("name",namelist.get(i)); map.put("tel",tellist.get(i)); date.add(map); } SimpleAdapter adpater=new SimpleAdapter(this,date,R.layout.item_list,new String[]{"name","tel"},new int[]{R.id.tv_list_name,R.id.tv_list_apont} ); lv_main_view.setAdapter(adpater); lv_main_view.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { tv_main_view.setText(namelist.get(position)+" "+tellist.get(position)); } }); }xml代碼
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:orientation="vertical" tools:context="com.mdf_android01.android25_contentresolver02.MainActivity"> <TextView android:layout_width="match_parent" android:layout_height="30dp" android:id="@+id/tv_main_view" > </TextView> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="ContentProvider獲取所有聯系人" android:onClick="getContacts" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="隱式跳轉獲取聯系人" android:id="@+id/bt_main_button" /> <ListView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/lv_main_view" > </ListView></LinearLayout>真機效果圖
新聞熱點
疑難解答