博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ContentProvider:读取手机通讯录、号码等信息(16)
阅读量:6638 次
发布时间:2019-06-25

本文共 9980 字,大约阅读时间需要 33 分钟。

hot3.png

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
> 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
> roladDataFromTable( ContentResolver resolver) { List
> list = new ArrayList
>(); // 查找没有删除的数据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
 map = new HashMap
(); 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
 dataMap = new HashMap
(); 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
 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
 mapItem = (Map
) 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
 map = (Map
) 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

转载于:https://my.oschina.net/u/2541146/blog/618020

你可能感兴趣的文章
thinkphp-性能调试
查看>>
迪拜迎来第一个“警察机器人”,警察这是要失业的节奏?
查看>>
掌握R语言中的apply函数族
查看>>
https
查看>>
修改用户标识符
查看>>
linux学习:持续集成篇--安装Jenkins持续集成平台-05
查看>>
mongodb shell 脚本
查看>>
linux系统修改系统时间与时区
查看>>
一个Monad的不严谨介绍桶
查看>>
人工智能可大大缩短新型重症药物的研发周期
查看>>
linux man使用方法及man中文手册安装方法
查看>>
mount命令详解
查看>>
深度学习与人工智能革命:part II
查看>>
查看 SELinux状态及关闭SELinux
查看>>
ALTER EXTSEQNO must be performed on each corresponding downstream reader
查看>>
JavaScript ~~~~~ 清空上一次上传的文件
查看>>
Hyper-V will not boot virtual SCSI devices
查看>>
如何使用MOS风格的代码背景?
查看>>
Egret之Socket.io(一)
查看>>
LAMP_apache安装_2
查看>>