ContentProvider:讀取手機通信錄、號碼等信息(16)

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

相關文章
相關標籤/搜索