今天給大家講講安卓四大基本組件中用內容接收者實現獲取手機聯繫人,講兩種方式,一是底層的做法獲取手機聯繫人,二是跳到系統聯繫人頁面拿手機聯繫人
現在先看兩張效果圖,因涉及了一些私人的號碼,所以小編就塗鴉啦。
如圖所看,第一張圖的效果是用底層做法獲取聯繫人號碼在遍歷在自己的頁面,現在我們就來上代碼
//得到訪問者
cr = getContentResolver();
//實例化一個的list集合的數據
listdata = new ArrayList<Map<String,Object>>();
//設置適配器
simpleAdapter = new SimpleAdapter(this, listdata,android.R.layout.simple_list_item_2,new String[]{"names","phones"},new int[]{android.R.id.text1,android.R.id.text2});
lv_id_listview.setAdapter(simpleAdapter);
//獲取聯繫人號碼(底層做法)
public void getContacts(View view){
Cursor cursor=cr.query(Uri.parse("content://com.android.contacts/raw_contacts"),null,null,null,null);
while(cursor.moveToNext()){
Map<String,Object> map=new HashMap<String,Object>();
int uid=cursor.getInt(cursor.getColumnIndex("_id"));
String uname=cursor.getString(cursor.getColumnIndex("display_name"));
Log.i("test",uid+" "+uname);
map.put("names",uname);
Cursor cursor2=cr.query(Uri.parse("content://com.android.contacts/raw_contacts/"+uid+"/data"),null,null,null,null);
while(cursor2.moveToNext()){
String type= cursor2.getString(cursor2.getColumnIndex("mimetype"));
if ("vnd.android.cursor.item/phone_v2".equals(type)){
data1 = cursor2.getString(cursor2.getColumnIndex("data1"));
Log.i("test",type+" "+data1);
map.put("phones",data1);
Notity(data1,map);//(大循環的裏面,小循環的外面,就是循環兩個循環數據裏面的數據。放到小循環裏就只顯示有號碼的聯繫人)
}
}
}
//通知適配器發生改變
simpleAdapter.notifyDataSetChanged();
}
這就是第一種底層的做法
現在來看第二種直接獲取系統的聯繫人
跳轉到手機聯繫人的界面
//獲取系統聯繫人號碼
public void getSystem(View view){
Intent intentphone = new Intent(Intent.ACTION_PICK);
intentphone.setData(ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(intentphone, 0);
}
點擊某個聯繫人獲取選中的信息,就是要帶結果返回,所以要用Activity中帶結果返回的onActivityResult方法,看代碼
/帶結果返回
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (resultCode) {
case RESULT_OK:
Map<String,Object> map=new HashMap<String,Object>();
ContentResolver contentResolver = getContentResolver();//ContentResolver實例帶的方法可以實現找到指定的ContentProvider並獲取到他的數據
Uri contactDate = data.getData();//uri,每個內容提供者定義一個唯一的公開的uri,用於指定他的數據集,查詢就是輸入uri等參數,其中uri是必須,其他的是可選,如果系統能找到uri對應的內容提供者將返回一個cursor對象
Cursor cursor = managedQuery(contactDate, null, null, null, null);
cursor.moveToFirst();
//獲取data表中的名字
String uanme = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
String nameId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));//條件爲聯繫人的id
//獲取data表中的電話號碼,條件爲聯繫人id,因爲手機號碼可能爲多個
Cursor phone = contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + nameId, null, null);
while (phone.moveToNext()) {
String phonenumber = phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
map.put("phones",phonenumber);
map.put("names",uanme);
Notity(phonenumber,map);//自定義的通知適配器改變
}
break;
default:
break;
}
}
此方法通知適配器改變需要把通知寫到外面,在到裏邊調用,適配器才能發生改變,否則不會有作用。因爲小編是把兩者的一起點擊用的,這樣的話,就會有一個問題,就是在點擊第二個獲取系統的號碼後,在點擊第一個獲取號碼便會添加兩個相同的號碼,所以爲了解決這個問題,便是在自定義的通知適配器改變的方法裏,做去重複的操作,看代碼
//通知適配器發生改變
public void Notity(String phonenumber,Map<String, Object> map){
if (!listdata.isEmpty()){
for (Map<String, Object> stringObjectMap : listdata) {
String phones= (String) stringObjectMap.get("phones");
dataphone.add(phones);
}
if (dataphone.contains(phonenumber)){
Toast.makeText(this, phonenumber+"已經添加過", Toast.LENGTH_SHORT).show();
}else{
listdata.add(map);
}
}else {
listdata.add(map);
}
simpleAdapter.notifyDataSetChanged();
}
這兩種方式就完成了,最後要記住的是要記得加權限:
讀取手機聯繫人的權限
<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>