import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.EditText; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.Toast; public class MainActivity extends Activity implements OnItemLongClickListener, OnItemClickListener { // 操做手機通信錄 private String uri_contacts = "content://com.android.contacts/contacts";// 手機通信錄如今有的聯繫人 private String uri_raw_contacts = "content://com.android.contacts/raw_contacts";// 原始的通信錄(包括已經刪除的聯繫人) private String uri_data = "content://com.android.contacts/data";// 與raw_contacts關聯的表,插入時除了更新raw_contacts還要更新data表 private String uri_data_phone = "content://com.android.contacts/data/phones";//data/phones手機號信息 private String uri_data_email = "content://com.android.contacts/data/emails";//data/emails信息 private List<Map<String, String>> list; private SimpleAdapter adapter; private ContentResolver resolver; private ListView listview; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listview = (ListView) this .findViewById(R.id.listView_main_contactslist); resolver = getContentResolver(); list = roladDataFromTable(resolver); adapter = new SimpleAdapter(this, list, R.layout.item_listview_main, new String[] { "id", "displayname", "phones", "emails" }, new int[] { R.id.text_item_id, R.id.text_item_displayname, R.id.text_item_phones, R.id.text_item_emails }); listview.setAdapter(adapter); // 長按時刪除 listview.setOnItemLongClickListener(this); // 點擊時修改 listview.setOnItemClickListener(this); } // 查詢全部沒有被刪除的聯繫人 private List<Map<String, String>> roladDataFromTable( ContentResolver resolver) { List<Map<String, String>> list = new ArrayList<Map<String, String>>(); // 查找沒有刪除的數據deleted=0; Cursor cursor_Contacts = resolver .query(Uri.parse(uri_raw_contacts), new String[] { "_id", "display_name" }, "deleted=0", null, null); while (cursor_Contacts.moveToNext()) { Map<String, String> map = new HashMap<String, String>(); String raw_contacts_id = cursor_Contacts.getString(cursor_Contacts .getColumnIndex("_id")); String display_name = cursor_Contacts.getString(cursor_Contacts .getColumnIndex("display_name")); // 封裝在map map.put("id", raw_contacts_id); map.put("display_name", display_name); // 根據raw_contact_id查詢data表的phone的信息 , 注意uri路徑 Cursor cursorPhones = resolver.query(Uri.parse(uri_data_phone), new String[] { "data1" }, "raw_contact_id=?", new String[] { "raw_contact_id" }, null); StringBuilder sb = new StringBuilder(); // 可能有多個號碼 while (cursorPhones.moveToNext()) { sb.append(cursorPhones.getString(0)).append(" "); } map.put("phones", sb.toString()); cursorPhones.close(); // // 根據raw_contact_id查詢data表的email的信息 , 注意uri路徑 Cursor cursorEmail = resolver.query(Uri.parse(uri_data_email), new String[] { "data1" }, "raw_contact_id=?", new String[] { "raw_contact_id" }, null); StringBuilder sb2 = new StringBuilder(); // 可能有多個郵箱 while (cursorEmail.moveToNext()) { sb2.append(cursorEmail.getString(0)).append(" "); } // 封裝在map map.put("emails", sb2.toString()); cursorEmail.close(); list.add(map); } cursor_Contacts.close(); return list; } // 添加按鈕事件,添加聯繫人 public void clickButton(View view) { AlertDialog.Builder builder = createBuilder(R.drawable.ic_launcher, "添加聯繫人"); View insertView = getLayoutInflater().inflate( R.layout.dialog_insert_info, null); final EditText contactname = (EditText) insertView .findViewById(R.id.editText_dialog_contactname); final EditText phone = (EditText) insertView .findViewById(R.id.editText_dialog_phone); final EditText email = (EditText) insertView .findViewById(R.id.editText_dialog_email); builder.setView(insertView); // 肯定按鈕事件 builder.setPositiveButton("肯定", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Map<String, String> dataMap = new HashMap<String, String>(); dataMap.put("display_name", contactname.getText().toString()); dataMap.put("phone", phone.getText().toString()); dataMap.put("email", email.getText().toString()); boolean result = insertContact(resolver, dataMap); if (result) { Toast.makeText(MainActivity.this, "添加聯繫人成功!", Toast.LENGTH_SHORT).show(); Intent intent = new Intent(MainActivity.this, MainActivity.class); startActivity(intent);// 添加成功跳回本頁面 finish(); } else { Toast.makeText(MainActivity.this, "添加聯繫人失敗!", Toast.LENGTH_SHORT).show(); } } }); builder.show(); } // 添加聯繫人 public boolean insertContact(ContentResolver resolver, Map<String, String> dataMap) { try { // 先插入一條raw_contacts數據 , 空數據 ContentValues values = new ContentValues(); Uri uri = resolver.insert(Uri.parse(uri_raw_contacts), values);// 該uri包含新增數據的id // 獲取新插入raw_contacts的主鍵id,經過id查找關聯表進行數據添加 long id = ContentUris.parseId(uri); // 經過id還要更新其餘的表 // 插入data表聯繫人的姓名,要匹配id和表中的字段,不能隨便取 values.put("raw_contact_id", id); // 參考視圖:view_data mimetype 是視圖列名錶示類型如姓名、email,等類型 values.put("mimetype", "vnd.android.cursor.item/name"); values.put("data1", dataMap.get("display_name")); values.put("data2", dataMap.get("display_name")); // 注意:不要傳錯uri !!! resolver.insert(Uri.parse(uri_data), values); // 插入data表聯繫人的電話 values.clear();// 清空上次數據 values.put("raw_contact_id", id); values.put("mimetype", "vnd.android.cursor.item/phone_v2"); values.put("data1", dataMap.get("phone")); // 住宅電話爲1;手機號碼爲2;單位電話爲3. values.put("data2", 2); resolver.insert(Uri.parse(uri_data), values); // 插入data表聯繫人的email values.clear(); values.put("raw_contact_id", id); values.put("mimetype", "vnd.android.cursor.item/email_v2"); values.put("data1", dataMap.get("email")); values.put("data2", 1); resolver.insert(Uri.parse(uri_data), values); return true; } catch (Exception e) { Log.i("MainActivity", "插入異常" + e.getMessage()); e.printStackTrace(); } return false; } public Builder createBuilder(int icLauncher, String string) { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(string); builder.setIcon(icLauncher); builder.setNegativeButton("取消", null); return builder; } // 短按點擊修改聯繫人 @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Map<String, String> mapItem = (Map<String, String>) parent .getItemAtPosition(position); String display_name = mapItem.get("display_name"); final String raw_contact_id = mapItem.get("id"); AlertDialog.Builder builder = createBuilder(R.drawable.ic_launcher, "修改聯繫人"); View updateView = getLayoutInflater().inflate( R.layout.dialog_update_info, null); EditText text_id = (EditText) updateView .findViewById(R.id.editText_update_id); final EditText text_displayname = (EditText) updateView .findViewById(R.id.editText_update_displayname); builder.setView(updateView); text_id.setText(raw_contact_id); text_displayname.setText(display_name); builder.setPositiveButton("肯定", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { boolean flag = updateContactName(resolver, raw_contact_id, text_displayname.getText().toString()); if (flag) { Toast.makeText(MainActivity.this, "修改ok!", Toast.LENGTH_SHORT).show(); Intent intent = new Intent(MainActivity.this, MainActivity.class); startActivity(intent); finish(); } else { Toast.makeText(MainActivity.this, "修改失敗!", Toast.LENGTH_SHORT).show(); } } }); builder.show(); } // 修改聯繫人提取出來的方法 private boolean updateContactName(ContentResolver resolver, String raw_contact_id, String display_name) { // 經過視圖來修改: view_data view_raw_contacts ContentValues values = new ContentValues(); values.put("display_name", display_name); values.put("display_name_alt", display_name); values.put("sort_key", display_name); values.put("sort_key_alt", display_name); resolver.update(Uri.parse(uri_raw_contacts), values, "_id=?", new String[] { raw_contact_id }); values.clear(); values.put("data1", display_name); values.put("data2", display_name); int row = resolver.update(Uri.parse(uri_data), values, "raw_contact_id=? and mimetype=?", new String[] { raw_contact_id, "vnd.android.cursor.item/name" }); if (row > 0) { return true; } return false; } // 長按刪除聯繫人 @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { Map<String, Object> map = (Map<String, Object>) parent .getItemAtPosition(position); // 獲取adapter某一項對應的map final String raw_contact_id = (String) map.get("id"); AlertDialog.Builder builder = createBuilder(R.drawable.ic_launcher, "提示:"); builder.setMessage("肯定要刪除嗎?"); builder.setPositiveButton("肯定", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { boolean flag = deleteContactsInfo(raw_contact_id); if (flag) { Toast.makeText(MainActivity.this, "刪除成功!", Toast.LENGTH_SHORT).show(); Intent intent = new Intent(MainActivity.this, MainActivity.class); // intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(intent); finish(); } else { Toast.makeText(MainActivity.this, "刪除失敗!", Toast.LENGTH_SHORT).show(); } } }); builder.show(); return true;// 注意長按是要改成true,不然會跳到短按點擊那裏。有關事件分發 } public boolean deleteContactsInfo(String raw_contact_id) { // 刪除只是把raw_contacts表中的外鍵contact_id設置爲null,Contacts表中刪除記錄 ContentResolver resolver = getContentResolver(); int row = resolver.delete(Uri.parse(uri_raw_contacts), "_id=?", new String[] { raw_contact_id }); if (row > 0) { return true; } return false; } }
權限:android.permission.READ_CONTACTSjava
android.permission.WRITE_CONTACTSandroid
android.permission.MOUNT_UNMOUNT_FILESYSTEMSapp
主佈局:放的是一個button,一個listview ,添加數據的主句放的是三個EditTextide
,添加聯繫人佈局放的是三個EditText,修改佈局放的是兩個EditText, 佈局
listview自定義佈局放的是四個TextViewui