获取联系人
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. }
以上是关于获取联系人的主要内容,如果未能解决你的问题,请参考以下文章
为啥 recyclerview$adapter 在片段中为空