1.联系人操作:
- 实现思路:
- 使用到ContentProvider
- 调用context的getContentResolver()方法,得到resolver
- 再调用resolver的CRUD方法
- 参考官方文档:API Guides–>Content Providers–>Contacts Provider
1.1 查询联系人
1.1.1查询方式:
方式一:根据字段在数据库中查询
- 需要查询两个表:
- raw_contacts表:uri:
content://com.android.contacts/raw_contacts
- data表:uri:
content://com.android.contacts/data
- raw_contacts表:uri:
- 步骤:
- 先从raw_contacts表中查出contact_id,此时,创建javabean对象
- 然后在data表中根据contact_id去查询data1和mimetype;
- 根据mimetype(具体可查看contacts2.db)设置javabean的变量值
- 将javabean添加到集合中,返回list集合
- 需要查询两个表:
方式二:利用封装的API
- 思路:
- 使用ContactsContract类(android.provider包)
- CommonDataKinds为内部类
步骤:
- 获取查询的Uri:调用ContactsContract.CommonDataKinds.Phone的CONTENT_URI
- 编写需要返回的字段数组(DISPLAY_NAME,NUMBER,CONTACT_ID)
- 调用的resovler的query,得到cursor
- 根据下标,获取cursor的字段,并保存到javabean中
- 关闭cursor
- 将javabean添加到集合中,并返回
获取联系人的头像:
- 获取uri:
Uri contactUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, contactId);
- 调用ContactsContract.Contacts的openContactPhotoInputStream,获取流
- 将输入流解析成Bitmap
- 获取uri:
- 思路:
1.1.2 启动系统自带的联系人界面,并返回选择的结果
思路:
查看上层应用源码的清单配置文件
<activity android:name="ContactsListActivity" android:label="@string/contactsList" android:clearTaskOnLaunch="true"> <intent-filter> <action android:name="android.intent.action.PICK" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="vnd.android.cursor.dir/contact" /> <data android:mimeType="vnd.android.cursor.dir/person" /> <data android:mimeType="vnd.android.cursor.dir/phone_v2" /> <data android:mimeType="vnd.android.cursor.dir/phone" /> <data android:mimeType="vnd.android.cursor.dir/postal-address_v2" /> <data android:mimeType="vnd.android.cursor.dir/postal-address" /> </intent-filter> </activity>
- 调用android.intent.action.PICK
- 扩展:
- 查找视频:intent.setType(“video/*”);
- 查找图片:intent.setType(“image/*”); 此处调用的是系统的图库,返回的data为uri
- 扩展:
- 发现返回的结果是一个uri,故根据uri去查询相应的数据即可
实现步骤:
添加读取联系人的权限,由于此处是通过uri去查询信息
public void addClick(View v){ //点击启动系统的联系人界面,等待结果返回 Intent intent = new Intent(); intent.setAction(Intent.ACTION_PICK); intent.setType("vnd.android.cursor.dir/phone_v2"); startActivityForResult(intent, REQUEST_CODE_NUMBER); }
2.获取返回的结果
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); //点击某个联系人后,有结果返回,data不为null,resultCode = -1 //未点击联系人,直接取消,data为null,resultCode = 0 Log.d(TAG, "resultCode="+resultCode+"---data="+data); if (data != null) { Uri uri = data.getData(); String[]projection = { ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER }; Cursor cursor = getContentResolver().query(uri, projection, null, null, null); if (cursor.moveToNext()) { String number = cursor.getString(1); mTv_number.setText(number); //将光标置于最后 mTv_number.setSelection(number.length()); } } }
1.2 添加联系人
1.2.1 逐条添加
思路:
- 先向raw_contact表添加数据
- 在向往data表添加数据(姓名,号码,邮箱等)
实现步骤:
- 先获取输入项,获取raw_contact表和data表的Uri
- 得到ContentResolver对象
- 按降序查询数据库中的最后一个id值,如果数据库中有记录,将id值+1;没有记录就赋值为1
- 根据id往data表中添加数据(key和alue值参考contacts2.db的data表)
说明:
- 关于添加时id的获取:可以调用ContentUris的parseId(API 23新增)
long contactid = ContentUris.parseId(resolver.insert(uri, values));
- 关于添加时id的获取:可以调用ContentUris的parseId(API 23新增)
示例:
public void add(View v){ String name = et_name.getText().toString().trim(); String phone = et_phone.getText().toString().trim(); String email = et_email.getText().toString().trim(); //执行添加操作 ContentResolver resolver = getContentResolver(); Uri contactUri = Uri .parse("content://com.android.contacts/raw_contacts"); Uri dataUri = Uri.parse("content://com.android.contacts/data"); // 往 raw_contact表添加数据 ContentValues values = new ContentValues(); Cursor cursor = resolver.query(contactUri, new String[]{"_id"}, null, null, "_id DESC"); int id = 1; // 预先指定这个id 是1 , if(cursor.moveToNext()){ //如果数据库里面已经存在了记录,那么就去替换早前的id数值 id = cursor.getInt(cursor.getColumnIndex("_id"))+1; } values.put("contact_id", id); resolver.insert(contactUri , values); //往data表添加数据 //添加姓名 ContentValues nameVal = new ContentValues(); nameVal.put("data1", name); nameVal.put("raw_contact_id", id); nameVal.put("mimetype", "vnd.android.cursor.item/name"); resolver.insert(dataUri, nameVal); //添加手机号码 ContentValues phoneVal = new ContentValues(); phoneVal.put("data1", phone); phoneVal.put("raw_contact_id", id); phoneVal.put("mimetype", "vnd.android.cursor.item/phone_v2"); resolver.insert(dataUri, phoneVal); //添加邮箱 ContentValues emailVal = new ContentValues(); emailVal.put("data1", email); emailVal.put("raw_contact_id", id); emailVal.put("mimetype", "vnd.android.cursor.item/email_v2"); resolver.insert(dataUri, emailVal); Toast.makeText(this, "添加成功", Toast.LENGTH_SHORT).show(); }
1.2.2 批量添加
示例:
//批量添加 public void addAllContact() throws Exception{ Uri uri = Uri.parse("content://com.android.contacts/raw_contacts"); ContentResolver resolver = getContext().getContentResolver(); ArrayList<contentprovideroperation> operations = new ArrayList<contentprovideroperation>(); ContentProviderOperation op1 = ContentProviderOperation.newInsert(uri) .withValue("account_name", null) .build(); operations.add(op1); uri = Uri.parse("content://com.android.contacts/data"); //添加姓名 ContentProviderOperation op2 = ContentProviderOperation.newInsert(uri) .withValueBackReference("raw_contact_id", 0) .withValue("mimetype", "vnd.android.cursor.item/name") .withValue("data2", "小花") .build(); operations.add(op2); //添加电话号码 ContentProviderOperation op3 = ContentProviderOperation.newInsert(uri) .withValueBackReference("raw_contact_id", 0) .withValue("mimetype", "vnd.android.cursor.item/phone_v2") .withValue("data1", "10088") .withValue("data2", "2") .build(); operations.add(op3); resolver.applyBatch("com.android.contacts", operations); }
1.3 删除联系人
思路:
- 根据姓名在raw_contacts表查出id;
- 在data表中只要raw_contact_id匹配的都删除;
示例:
public void delete() throws Exception{ String name = "小花"; //1.根据姓名查找id Uri contactUri = Uri.parse("content://com.android.contacts/raw_contacts"); Uri dataUri = Uri.parse("content://com.android.contacts/data"); ContentResolver resolver = getContext().getContentResolver(); Cursor cursor = resolver.query(uri, new String[]{Data._ID},"display_name=?", new String[]{name}, null); if(cursor.moveToFirst()){ int id = cursor.getInt(0); //删除raw_contacts中的数据 resolver.delete(contactUri, "display_name=?", new String[]{name}); uri = Uri.parse("content://com.android.contacts/data"); //2.根据id删除data表中的相应数据 resolver.delete(dataUri, "raw_contact_id=?", new String[]{id+""}); } }
1.4 修改联系人
- 思路: 不需要更新raw_contacts,只需要更新data表
示例:修改电话号码
public void update()throws Exception{ int id = 1; String phone = "10089"; Uri uri = Uri.parse("content://com.android.contacts/data");//对data表的所有数据操作 ContentResolver resolver = this.getContext().getContentResolver(); ContentValues values = new ContentValues(); values.put("data1", phone); resolver.update(uri, values, "mimetype=? and raw_contact_id=?", new String[]{"vnd.android.cursor.item/phone_v2",id+""}) }