還記得如何寫一個電話簿(Phone book) (ContentResolver)嗎?
其實還少很多功能, 例如新增/修改/刪除/查詢, 以及傳送簡訊
而當中還欠缺畫面即時更新, 我們還有很多可以做呢:)
上次只用到Call的功能, 因此這次加入了三個功能
由於新增了很多方法, 因此我將許多方法包成一個類別HandlePhoneBook
裡面有Query, Insert 以及 Delete三個方法, Update方法目前我還沒研究出來怎麼寫:P
暫時先放著>"<
另外在加上一個額外的小功能: 傳簡訊
請參考如何使用SmsManager傳簡訊
Query
目的就是讓搜尋出來的電話號碼跟名字都存在contactsArrayList這個容器裡面,
這樣一來, 我們就可以利用這個類別的物件, 隨時對畫面作即時更新。
然後我們就對contactArrayList做增加的動作, 再來對adapter作更新的動作,
就可以讓畫面馬上多一筆資料。
系統電話簿
接著再用這個id去找出資料庫的這筆資料, 將它刪除。
最主要的就是這三個方法。
程式碼
http://uploadingit.com/file/ngqww8dedfs3gvf2/ProviderContactDemo2.zip
其實還少很多功能, 例如新增/修改/刪除/查詢, 以及傳送簡訊
而當中還欠缺畫面即時更新, 我們還有很多可以做呢:)
上次只用到Call的功能, 因此這次加入了三個功能
由於新增了很多方法, 因此我將許多方法包成一個類別HandlePhoneBook
裡面有Query, Insert 以及 Delete三個方法, Update方法目前我還沒研究出來怎麼寫:P
暫時先放著>"<
另外在加上一個額外的小功能: 傳簡訊
請參考如何使用SmsManager傳簡訊
Query
public void query(){
contactsArrayList.clear();
contacts_name = mContentResolver.query(
ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
while (contacts_name.moveToNext()) {
contactsMap = new HashMap<String, String>();
long id = contacts_name.getLong(contacts_name
.getColumnIndex(ContactsContract.Contacts._ID));
contacts_number = mContentResolver.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "="
+ Long.toString(id), null, null);
String phoneNumber = "";
while(contacts_number.moveToNext()){
phoneNumber = contacts_number
.getString(contacts_number
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
}
contacts_number.close();
String name = contacts_name
.getString(contacts_name.getColumnIndex(
ContactsContract.Contacts.DISPLAY_NAME));
contactsMap.put(NAME, name);
contactsMap.put(NUMBER, phoneNumber);
contactsArrayList.add(contactsMap);
}
}
這個方法是之前getPhoneBookData搬過來的, 目的就是讓搜尋出來的電話號碼跟名字都存在contactsArrayList這個容器裡面,
這樣一來, 我們就可以利用這個類別的物件, 隨時對畫面作即時更新。
public void insert(String name, String number){
ContentValues values = new ContentValues();
Uri rawContactUri = mContentResolver.insert(RawContacts.CONTENT_URI, values);
long rawContactId = ContentUris.parseId(rawContactUri);
values.clear();
values.put(Data.RAW_CONTACT_ID, rawContactId);
values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
values.put(StructuredName.GIVEN_NAME, name);
mContentResolver.insert(ContactsContract.Data.CONTENT_URI, values);
values.clear();
values.put(Data.RAW_CONTACT_ID, rawContactId);
values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
values.put(Phone.NUMBER, number);
values.put(Phone.TYPE, Phone.TYPE_MOBILE);
mContentResolver.insert(ContactsContract.Data.CONTENT_URI, values);
}
這個方法, 會讓使用者輸入名字跟電話號碼, 就可以把資料寫入系統電話簿,然後我們就對contactArrayList做增加的動作, 再來對adapter作更新的動作,
就可以讓畫面馬上多一筆資料。
系統電話簿
public void delete(String name) {
Cursor c = mContentResolver.query(
ContactsContract.Contacts.CONTENT_URI,
null,
ContactsContract.Contacts.DISPLAY_NAME+"="+"'"+name+"'",
null,
null);
c.moveToFirst();
String id = c.getString((c.getColumnIndex("_id")));
ArrayList<ContentProviderOperation> ops =
new ArrayList<ContentProviderOperation>();
ops.add(ContentProviderOperation
.newDelete(ContactsContract.RawContacts.CONTENT_URI)
.withSelection(Data.CONTACT_ID + "=?", new String[]{id})
.build());
try {
mContentResolver.applyBatch(ContactsContract.AUTHORITY, ops);
}
catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (OperationApplicationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
這個刪除的方法, 先搜尋要刪除的資料的id,接著再用這個id去找出資料庫的這筆資料, 將它刪除。
最主要的就是這三個方法。
程式碼
http://uploadingit.com/file/ngqww8dedfs3gvf2/ProviderContactDemo2.zip