获取联系人

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获取联系人相关的知识,希望对你有一定的参考价值。

技术分享

 技术分享

①查询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.    }

 


以上是关于获取联系人的主要内容,如果未能解决你的问题,请参考以下文章

如何使用片段将联系人选择到edittext

检索数据未出现在 ListView 的片段中

为啥 recyclerview$adapter 在片段中为空

从单个按钮从多个片段中提取数据

片段中带有 RequestPermission 的 registerForActivityResult 不起作用

我可以在 android studio 的片段上使用 Firebase 吗?