內容提供者之讀取手機聯絡人
阿新 • • 發佈:2019-02-13
我今天給大家講的是通過內容訪問者讀取到手機的聯絡人和電話號碼,
先分析,我們要拿到聯絡人和電話號碼是二組資料,所有我們可以使用SimpleAdapter介面卡,讓我們先來看看效果,
可以看到除了聯絡人和電話號碼還有id,首先我們想要對手機系統的一些機密檔案讀取我們
必須擁有那個許可權
讀取手機聯絡人的許可權
<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>
接下來我們要拿到資料來源,也就是聯絡人和電話號碼和id
用list集合來裝資料來源
List<Map<String,String>> list=new ArrayList<Map<String, String>>();
獲取內容提供者的uri,並且還有content協議,類似http協議
Uri uri=Uri.parse("content://com.android.contacts/raw_contacts"); Cursor cursor=cr.query(uri,null,null,null,null);
拿到所有聯絡人的名字
while (cursor.moveToNext()){ Map<String,String> map=new到了這一步有必要跟大家扯一下型別轉換的問題了,可以看到我們的id是int型別的,那麼HashMap<String,String>(); int id=cursor.getInt(cursor.getColumnIndex("_id")); String name=cursor.getString(cursor.getColumnIndex("display_name"));
在安卓裡面是怎麼轉換型別的呢
1 如何將字串 String 轉換成整數 int?
A. 有兩個方法:
1). int i = Integer.parseInt([String]);
或 i = Integer.parseInt([String],[int radix]);
2). int i = Integer.valueOf(my_str).intValue();
注: 字串轉成 Double, Float, Long 的方法大同小異.
2 如何將整數 int 轉換成字串 String ?
A. 有叄種方法:
1.) String s = String.valueOf(i);
2.) String s = Integer.toString(i);
3.) String s = "" + i;
注: Double, Float, Long 轉成字串的方法大同小異.
String pid=""+id;
map.put("id",pid); map.put("name",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()){
注意下面這種方法雖然能拿到號碼,但是會報空指標的錯,別問為什麼,等我研究下再說 // int type=cursorData.getInt(cursorData.getColumnIndex("mimetype_id")); String type=cursorData.getString(cursorData.getColumnIndex("mimetype")); String data1=cursorData.getString(cursorData.getColumnIndex("data1"));
map.put("data1",data1);
有了資料來源,那一切都簡單了
SimpleAdapter simpleAdapter=new SimpleAdapter( this,//上下文 lists,//資料來源 R.layout.item,//佈局檔案 new String[]{"id","name","data1"},//資料從哪來 new int[]{R.id.tv_item1,R.id.tv_item2,R.id.tv_item3});//資料放到哪去 //繫結介面卡 lv_main_1.setAdapter(simpleAdapter);
最後執行就ok啦