获取联系人

①查询raw_contacts表 获取每一个联系人的contact_id值

②拿着查到的这个contact_id 到data表中查询 (raw_contact_id这一列作为查询的条件)查mime_type_id 和 data1

data1的数据最终要保存起来 mimetype_id这一列的值是作为类型判断的依据

获取联系人private ArrayList<Contact> getContacts(ContentResolver resolver) {
    ArrayList<Contact> contacts = new ArrayList<Contact>();
    //①获取内容解析者
      // ContentResolver resolver = getContentResolver();
       //②确定uri
       Uri data_uri = Uri.parse("content://com.android.contacts/data");
       Uri raw_contacts_uri = Uri.parse("content://com.android.contacts/raw_contacts");
       //③查询raw_contacts表 确定联系人的编号
    Cursor cursor = resolver.query(raw_contacts_uri, new String[]{"contact_id"}, null, null, null);
    while(cursor.moveToNext()){
        String id = cursor.getString(0);
        System.out.println(id);
        //每查到一个id 就到data表中查询对应的联系人数据 所有的数据对应一个联系人
//        Cursor cursor2  = resolver.query(data_uri, null, "raw_contact_id = ?", new String[]{id}, null);
//        while(cursor2.moveToNext()){
//            for(int i = 0;i<cursor2.getColumnCount();i++){
//                String name = cursor2.getColumnName(i);
//                if(name.startsWith("mime")){
//                    System.out.println(name);
//                    break;
//                }
//            }
//        }
        Contact contact = new Contact();
        Cursor cursor2 = resolver.query(data_uri, new String[]{"data1","mimetype"}, "raw_contact_id = ?", new String[]{id}, null);
        while(cursor2.moveToNext()){
            String data = cursor2.getString(0);
            String type = cursor2.getString(1);
            System.out.println("data="+data+"type="+type);
            //如果类型是emailt 说明这一行数据记录的是电子邮件 所以把data值用contact.email进行保存
            if("vnd.android.cursor.item/email_v2".equals(type)){
                contact.email = data;
            }else if("vnd.android.cursor.item/phone_v2".equals(type)){
                contact.phone = data;
            }else if("vnd.android.cursor.item/postal-address_v2".equals(type)){
                contact.address = data;
            }else if("vnd.android.cursor.item/name".equals(type)){
                contact.name = data;
            }
        }
        //内层while循环执行完了 说明一个联系的信息已经保存完毕 可以contact对象放到集合中
        contacts.add(contact);
    }
    //外层的while循环执行完之后 说明所有的联系人都保存到集合了
    for(Contact contact:contacts){
        System.out.println(contact);
    }
    return contacts;
}
    
 //插入联系人数据
35.               //①获取内容解析者
36.               ContentResolver resolver = getContentResolver();
37.                 Uri data_uri = Uri.parse("content://com.android.contacts/data");
38.                  Uri raw_contacts_uri = Uri.parse("content://com.android.contacts/raw_contacts");
39.               //②先通过查询raw_contacts表的数据数量 确定要插入的联系人的contact_id的值
40.                 Cursor cursor = resolver.query(raw_contacts_uri, new String[]{"contact_id"}, null, null, null);
41.                  //获取当前游标一共查询出了多少条数据
42.                  int count = cursor.getCount();
43.                  //③向raw_contact表中插入数据 就是新加入联系人的id
44.                  ContentValues values = new ContentValues();
45.                  values.put("contact_id", count+1);
46.               resolver.insert(raw_contacts_uri, values);
47.                  //④向data表中插入数据
48.               ContentValues datavalues = new ContentValues();
49.               //向raw_contact_id列中插入数据
50.               datavalues.put("raw_contact_id", count+1);
51.               //向data1这一列中插入数据  数据是地址
52.               datavalues.put("data1", address);
53.               //由于插入的数据是地址 所以mimetype 这一列的值对应的内容应该是地址
54.               datavalues.put("mimetype", "vnd.android.cursor.item/postal-address_v2");
55.               //向data表中插入地址这一行
56.               resolver.insert(data_uri, datavalues);
57.
58.               //向raw_contact_id列中插入数据
59.                               datavalues.put("raw_contact_id", count+1);
60.                               //向data1这一列中插入数据  数据是电子邮件
61.                               datavalues.put("data1", email);
62.                               //由于插入的数据是电子邮件 所以mimetype 这一列的值对应的内容应该是电子邮件
63.                               datavalues.put("mimetype", "vnd.android.cursor.item/email_v2");
64.                               //向data表中插入电子邮件这一行
65.                               resolver.insert(data_uri, datavalues);
66.
67.                               //向raw_contact_id列中插入数据
68.                               datavalues.put("raw_contact_id", count+1);
69.                               //向data1这一列中插入数据  数据是电话
70.                               datavalues.put("data1", phone);
71.                               //由于插入的数据是电话 所以mimetype 这一列的值对应的内容应该是电话
72.                               datavalues.put("mimetype", "vnd.android.cursor.item/phone_v2");
73.                               //向data表中插入电话这一行
74.                               resolver.insert(data_uri, datavalues);
75.
76.                               //向raw_contact_id列中插入数据
77.                               datavalues.put("raw_contact_id", count+1);
78.                               //向data1这一列中插入数据  数据是姓名
79.                               datavalues.put("data1", name);
80.                               //由于插入的数据是姓名 所以mimetype 这一列的值对应的内容应该是姓名
81.                               datavalues.put("mimetype", "vnd.android.cursor.item/name");
82.                               //向data表中插入姓名这一行
83.                               resolver.insert(data_uri, datavalues);
84.        }
85.
86.}

8 内容观察者   contentObserver

在数据内容发生改变的地方通过contentResolver发送数据变化的通知 notifyChange

1.  @Override
2.          public Uri insert(Uri uri, ContentValues values) {
3.                 int result = sURIMatcher.match(uri);
4.                 if(result==INSERT_SUCCESS){
5.                         //说明插入的路径匹配成功
6.                         SQLiteDatabase database = helper.getReadableDatabase();
7.                         long insert = database.insert("info", null, values);
8.                         if(insert>0){
9.                                 //说明向表中插入了一条数据 实际上就是表中的内容发生了改变
10.                               //获取内容解析者 通过contentresolver发通知
11.                               ContentResolver resolver = getContext().getContentResolver();
12.                               // 第一个参数 发内容变化使用的uri content://com.itheima.provider/insert
13.                               // 第二个参数 内容观察者 如果传null所有的观察者只要注册了相同的uri就可以收到通知
14.                               resolver.notifyChange(uri, null);
15.                       }
16.                       database.close();
17.                       return Uri.parse(String.valueOf(insert));
18.               }
19.               return null;
20.        }

在需要接受变化的地方 注册一个内容观察者(可以在同一个应用中 也可以是在不同的应用中)

①写一个类继承ContentObserver 重写onChange方法
②通过contentResolver 调用registerObserver方法注册内容观察者

1.  public class MainActivity extends Activity {
2.
3.      @Override
4.      protected void onCreate(Bundle savedInstanceState) {
5.          super.onCreate(savedInstanceState);
6.          setContentView(R.layout.activity_main);
7.          //获取内容解析者
8.          ContentResolver resolver = getContentResolver();
9.          //通过内容解析者注册一个内容观察者
10.        Uri uri = Uri.parse("content://com.zz.provider");
11.        //第一个参数 uri 把内容观察者注册到这个uri上 如果有通知 说明这个uri对应的内容发生改变 内容观察者就会收到通知
12.        //第二个参数 路径匹配的规则 如果传入true 路径前部分匹配上就可以收到通知 如果传false只有整个路径都匹配上才能收到通知
13.        //第三个参数 内容观察者
14.               resolver.registerContentObserver(uri, false, new MyObserver(new Handler()));
15.
16.    }
17.
18.    private class MyObserver extends ContentObserver{
19.
20.               public MyObserver(Handler handler) {
21.                       super(handler);
22.               }
23.//
24.//             @Override
25.//             public void onChange(boolean selfChange) {
26.//                     super.onChange(selfChange);
27.//             }
28.               @Override
29.               public void onChange(boolean selfChange, Uri uri) {
30.                       //当收到了内容发生改变的通知就会调用onChange方法
31.                       System.out.println("内容发生改变了");
32.               }
33.    }
 
//插入联系人数据
35.               //①获取内容解析者
36.               ContentResolver resolver = getContentResolver();
37.                 Uri data_uri =Uri.parse("content://com.android.contacts/data");
38.                  Uri raw_contacts_uri =Uri.parse("content://com.android.contacts/raw_contacts");
39.               //②先通过查询raw_contacts表的数据数量 确定要插入的联系人的contact_id的值
40.                 Cursor cursor = resolver.query(raw_contacts_uri,newString[]{"contact_id"},null,null,null);
41.                  //获取当前游标一共查询出了多少条数据
42.                  int count = cursor.getCount();
43.                  //③向raw_contact表中插入数据 就是新加入联系人的id
44.                  ContentValues values =newContentValues();
45.                  values.put("contact_id", count+1);
46.               resolver.insert(raw_contacts_uri, values);
47.                  //④向data表中插入数据
48.               ContentValues datavalues =newContentValues();
49.               //向raw_contact_id列中插入数据
50.               datavalues.put("raw_contact_id", count+1);
51.               //向data1这一列中插入数据  数据是地址
52.               datavalues.put("data1", address);
53.               //由于插入的数据是地址 所以mimetype这一列的值对应的内容应该是地址
54.               datavalues.put("mimetype","vnd.android.cursor.item/postal-address_v2");
55.               //向data表中插入地址这一行
56.               resolver.insert(data_uri, datavalues);
57.               
58.               //向raw_contact_id列中插入数据
59.                               datavalues.put("raw_contact_id", count+1);
60.                               //向data1这一列中插入数据  数据是电子邮件
61.                               datavalues.put("data1", email);
62.                               //由于插入的数据是电子邮件 所以mimetype这一列的值对应的内容应该是电子邮件
63.                               datavalues.put("mimetype","vnd.android.cursor.item/email_v2");
64.                               //向data表中插入电子邮件这一行
65.                               resolver.insert(data_uri, datavalues);
66.                               
67.                               //向raw_contact_id列中插入数据
68.                               datavalues.put("raw_contact_id", count+1);
69.                               //向data1这一列中插入数据  数据是电话
70.                               datavalues.put("data1", phone);
71.                               //由于插入的数据是电话 所以mimetype这一列的值对应的内容应该是电话
72.                               datavalues.put("mimetype","vnd.android.cursor.item/phone_v2");
73.                               //向data表中插入电话这一行
74.                               resolver.insert(data_uri, datavalues);
75.                               
76.                               //向raw_contact_id列中插入数据
77.                               datavalues.put("raw_contact_id", count+1);
78.                               //向data1这一列中插入数据  数据是姓名
79.                               datavalues.put("data1", name);
80.                               //由于插入的数据是姓名 所以mimetype这一列的值对应的内容应该是姓名
81.                               datavalues.put("mimetype","vnd.android.cursor.item/name");
82.                               //向data表中插入姓名这一行
83.                               resolver.insert(data_uri, datavalues);
84.        }
85.    
86.}

8 内容观察者   contentObserver

在数据内容发生改变的地方通过contentResolver发送数据变化的通知 notifyChange

1.  @Override
2.          publicUri insert(Uri uri,ContentValues values){
3.                 int result = sURIMatcher.match(uri);
4.                 if(result==INSERT_SUCCESS){
5.                         //说明插入的路径匹配成功
6.                         SQLiteDatabase database = helper.getReadableDatabase();
7.                         long insert = database.insert("info",null, values);
8.                         if(insert>0){
9.                                 //说明向表中插入了一条数据 实际上就是表中的内容发生了改变
10.                               //获取内容解析者 通过contentresolver发通知
11.                               ContentResolver resolver = getContext().getContentResolver();
12.                               // 第一个参数 发内容变化使用的uri content://com.itheima.provider/insert
13.                               // 第二个参数 内容观察者 如果传null所有的观察者只要注册了相同的uri就可以收到通知
14.                               resolver.notifyChange(uri,null);
15.                       }
16.                       database.close();
17.                       returnUri.parse(String.valueOf(insert));
18.               }
19.               returnnull;
20.        }

在需要接受变化的地方注册一个内容观察者(可以在同一个应用中也可以是在不同的应用中)

①写一个类继承ContentObserver重写onChange方法\

②通过contentResolver调用registerObserver方法注册内容观察者

1.  publicclassMainActivityextendsActivity{
2.   
3.      @Override
4.      protectedvoid onCreate(Bundle savedInstanceState){
5.          super.onCreate(savedInstanceState);
6.          setContentView(R.layout.activity_main);
7.          //获取内容解析者
8.          ContentResolver resolver = getContentResolver();
9.          //通过内容解析者注册一个内容观察者
10.        Uri uri =Uri.parse("content://com.itheima.provider");
11.        //第一个参数 uri 把内容观察者注册到这个uri上 如果有通知 说明这个uri对应的内容发生改变 内容观察者就会收到通知
12.        //第二个参数 路径匹配的规则 如果传入true 路径前部分匹配上就可以收到通知 如果传false只有整个路径都匹配上才能收到通知
13.        //第三个参数 内容观察者
14.               resolver.registerContentObserver(uri,false,newMyObserver(newHandler()));
15.        
16.    }
17. 
18.    privateclassMyObserverextendsContentObserver{
19. 
20.               publicMyObserver(Handler handler){
21.                       super(handler);
22.               }
23.//      
24.//             @Override
25.//             public void onChange(boolean selfChange) {
26.//                     super.onChange(selfChange);
27.//             }
28.               @Override
29.               publicvoid onChange(boolean selfChange,Uri uri){
30.                       //当收到了内容发生改变的通知就会调用onChange方法
31.                       System.out.println("内容发生改变了");
32.               }
33.    }
时间: 2024-10-02 22:09:52

获取联系人的相关文章

关于ContentProvider的一些例子(获取联系人)

ContentResolver:是Android的四大组件之一,主要用于对外共享数据. Android提供了一些主要数据类型的ContentProvider,比如音频.视频.图片和私人通讯录等.前提是已经获取其权限. 主要方法 public boolean onCreate() 在创建ContentProvider时调用public Cursor query(Uri, String[], String, String[], String) 查询ContentProvider,返回一个Cursor

获取联系人信息

//这个变量用于记录授权是否成功,即用户是否允许我们访问通讯录     int __block tip=0;     //声明一个通讯簿的引用     ABAddressBookRef addBook =nil;     //因为在IOS6.0之后和之前的权限申请方式有所差别,这里做个判断     if ([[UIDevice currentDevice].systemVersion floatValue]>=6.0) {         //创建通讯簿的引用         addBook=A

内容提供者(获取联系人信息和插入联系人)

一丶获取联系人的信息 点击获取联系人信息 public void click(View view){        //获取内容解析器        ContentResolver resolver = getContentResolver() ;        //设定访问的uri(系统本机)        Uri uri = Uri.parse("content://com.android.contacts/raw_contacts") ;//联系人的id        Uri d

【Android Developers Training】 99. 获取联系人详细信息

注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer.android.com/training/contacts-provider/retrieve-details.html 这节课将会展示如何获取一个联系人的详细数据,比如电子邮件地址,电话号码,等等.当用户获得一个联系人后,他会想要查看他的详细信息.你可以展示给他们所有的信息,或者只展示某一特定类

Android 获取联系人手机号码、姓名、地址、公司、邮箱、生日

public void testGetAllContact() throws Throwable { //获取联系人信息的Uri Uri uri = ContactsContract.Contacts.CONTENT_URI; //获取ContentResolver ContentResolver contentResolver = ContactListActivity.this.getContentResolver(); //查询数据,返回Cursor Cursor cursor = con

weiyi通讯录(二)获取联系人信息包括头像 增删改查功能,

看了下第一期的访问量,100都没有可能很多人不需要吧,之前跟过一个大神学做项目,他都不吧核心代码告诉我,感觉没有一点分享精神,所以我就自己做.没跟他一起做 这里把上次的代码分享一下 我这里分享的跟我博客里面可能不一样因为我已经做完第一个模块了,代码就没有分开了 第一期的代码地址:http://download.csdn.net/detail/u010982856/8232855 分享的是类似的代码 基本跟我的是一样.如果需要的联系人我把 或者加入我的交流群吧 -----------欢迎加入交流群

ContentProvider往通讯录添加联系人和获取联系人

在Android中,可以使用ContentResolver对通信录中的数据进行添加.删除.修改和查询操作. 在对联系人进行操作时需加入以下两个权限 <!-- 添加操作联系人的权限 --><uses-permission android:name="android.permission.READ_CONTACTS" /><uses-permission android:name="android.permission.WRITE_CONTACTS&

android之获取联系人并按拼音排序

//获取联系人 //“display_name COLLATE LOCALIZED”:按姓名的拼音排序 Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, "display_name COLLATE LOCALIZED"); //遍历联系人 while(cursor.moveToNext()){ String phonesNumber=&q

ANDROID之获取联系人

Android入门中,记录学习中的遇到的问题和一些个人总结. 联系人数据库路径为:/data/data/com.android.providers.contacts/database/contacts2.db 权限问题:安卓6.0以上只是在XML中写权限还不够,代码中也需要写. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(Manifest.permission.READ_CONTA