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_CONTACTS
android.permission.WRITE_CONTACTS
android.permission.MOUNT_UNMOUNT_FILESYSTEMS
主布局:放的是一个button,一个listview ,添加数据的主句放的是三个EditText
,添加联系人布局放的是三个EditText,修改布局放的是两个EditText,
listview自定义布局放的是四个TextView