Android系统一般自带有:电话,邮件,浏览器功能;在电话通讯录及通信记录,均是以ContentProvider的形式向外来应用共享,所以我们要访问和操作通讯录,就需要通过ContentProvider实现。
操作通讯录:逻辑
- 首先需要知道Android系统的通讯录ContentProvider清单类容
- 然后获得其唯一标示
- 再然后去获得通讯录ContentProvider的业务路径
- 最后去操作通讯录的ContentProvider
查看Android自带电话通讯录源代码,得到ContentProvider如下:
查看Android自带电话通讯录源代码,得到通讯录ContentProvider业务路径如下:
查看Android自带电话通讯录源代码,得到通讯录ContentProvider共享表格内容类型如下:
类容类型目录表
操作类的ContactsService代码:
package com.example.administrator.foundationdemo.contactsprovider.contactsservice;
import android.content.ContentProviderOperation;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.OperationApplicationException;
import android.database.Cursor;
import android.net.Uri;
import android.os.RemoteException;
import android.util.Log;
import com.example.administrator.foundationdemo.contactsprovider.domain.ContactText;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Administrator on 2016/12/20.
*/
public class ContactsService {
private Context context;
public ContactsService(Context context){
this.context = context;
}
//获取所有联系人
public List<ContactText> visitContacts(){
List<ContactText> list = new ArrayList<ContactText>();
Uri uri = Uri.parse("content://com.android.contacts/contacts");//所有联系人的工作路径
ContentResolver resolver = context.getContentResolver();
Cursor cursor = resolver.query(uri, new String[]{
"_id"}, null, null, null);//获取所有联系人的ID
while (cursor.moveToNext()){
ContactText conract = new ContactText();
int contactcId = cursor.getInt(0);
uri = Uri.parse("content://com.android.contacts/contacts/" + contactcId + "/data");//某一个联系人工作路径
Cursor dateCursor = resolver.query(uri, new String[]{
"mimetype","data1","data2"}, null, null, null);//获取某一个联系人的信息
while (dateCursor.moveToNext()){
String date = dateCursor.getString(dateCursor.getColumnIndex("data1"));//信息
String type = dateCursor.getString(dateCursor.getColumnIndex("mimetype"));//内容类型