Android读写联系人数据(内容提供者应用)

2024-06-11 18:58

本文主要是介绍Android读写联系人数据(内容提供者应用),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转载

先加二个读和写权限:

<uses-permission android:name="android.permission.READ_CONTACTS" />

<uses-permission android:name="android.permission.WRITE_CONTACTS" />  

 

复制代码
package com.eboy.test;

import java.util.ArrayList;

import android.content.ContentProviderOperation;
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.test.AndroidTestCase;
import android.util.Log;

public  class ContectTest  extends AndroidTestCase {
    
     private  static  final String TAG = "TestContact";
    
     // 查询所有联系人的姓名,电话,邮箱
     public  void TestContact()  throws Exception {        
        Uri uri = Uri.parse("content://com.android.contacts/contacts");
        ContentResolver resolver = getContext().getContentResolver();
        Cursor cursor = resolver.query(uri,  new String[]{"_id"},  nullnullnull);
         while (cursor.moveToNext()) {
             int contractID = cursor.getInt(0);
            StringBuilder sb =  new StringBuilder("contractID=");
            sb.append(contractID);
            uri = Uri.parse("content://com.android.contacts/contacts/" + contractID + "/data");
            Cursor cursor1 = resolver.query(uri,  new String[]{"mimetype", "data1", "data2"},  nullnullnull);
             while (cursor1.moveToNext()) {
                String data1 = cursor1.getString(cursor1.getColumnIndex("data1"));
                String mimeType = cursor1.getString(cursor1.getColumnIndex("mimetype"));
                 if ("vnd.android.cursor.item/name".equals(mimeType)) {  // 是姓名
                    sb.append(",name=" + data1);
                }  else  if ("vnd.android.cursor.item/email_v2".equals(mimeType)) {  // 邮箱
                    sb.append(",email=" + data1);
                }  else  if ("vnd.android.cursor.item/phone_v2".equals(mimeType)) {  // 手机
                    sb.append(",phone=" + data1);
                }                
            }
            cursor1.close();
            Log.i(TAG, sb.toString());
        }
        cursor.close();
    }
    
     // 查询指定电话的联系人姓名,邮箱
     public  void testContactNameByNumber()  throws Exception {
        String number = "18052369652";
        Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/" + number);
        ContentResolver resolver = getContext().getContentResolver();
        Cursor cursor = resolver.query(uri,  new String[]{"display_name"},  nullnullnull);
         if (cursor.moveToFirst()) {
            String name = cursor.getString(0);
            Log.i(TAG, name);
        }
        cursor.close();
    }
    
     // 添加联系人,使用事务
     public  void testAddContact()  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", "13539777967")            
            .withValue("data2", "2")
            .build();
        operations.add(op3);
        
        ContentProviderOperation op4 = ContentProviderOperation.newInsert(uri)
        .withValueBackReference("raw_contact_id", 0)
        .withValue("mimetype", "vnd.android.cursor.item/email_v2")
        .withValue("data1", "asdfasfad@163.com")            
        .withValue("data2", "2")
        .build();
    operations.add(op4);
        
        resolver.applyBatch("com.android.contacts", operations);
    }
    
复制代码


/Files/jxgxy/ReadWriteContact.rar

转载:Android读写联系人数据(内容提供者应用) 

布局文件:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
< LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
     xmlns:tools = "http://schemas.android.com/tools"
     android:id = "@+id/ll"
     android:layout_width = "match_parent"
     android:layout_height = "match_parent"
     android:orientation = "vertical"
     android:paddingBottom = "@dimen/activity_vertical_margin"
     android:paddingLeft = "@dimen/activity_horizontal_margin"
     android:paddingRight = "@dimen/activity_horizontal_margin"
     android:paddingTop = "@dimen/activity_vertical_margin"
     tools:context = ".MainActivity" >
     < LinearLayout
         android:layout_width = "match_parent"
         android:layout_height = "wrap_content" >
         < Button
             android:id = "@+id/btn_getcontacts"
             android:layout_width = "0dp"
             android:layout_height = "wrap_content"
             android:onClick = "read_click"
             android:layout_weight = "1"
             android:text = "读取联系人" />
         < Button
             android:id = "@+id/btn_insertcontact"
             android:layout_width = "0dp"
             android:layout_height = "wrap_content"
             android:onClick = "insert_click"
             android:layout_weight = "1"
             android:text = "写入联系人" />
     </ LinearLayout >
</ LinearLayout >

核心Activity 两种方式:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
package com.example.readcontacts;
import java.util.ArrayList;
import java.util.List;
import com.pas.domain.ContactModel;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.app.Activity;
import android.content.ContentProviderOperation;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.view.Menu;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity  extends Activity
{
     LinearLayout ll;
     @Override
     protected void onCreate(Bundle savedInstanceState)
     {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         ll = (LinearLayout) findViewById(R.id.ll);
     }
     @Override
     public boolean onCreateOptionsMenu(Menu menu)
     {
         // Inflate the menu; this adds items to the action bar if it is present.
         getMenuInflater().inflate(R.menu.main, menu);
         return true ;
     }
     public void read_click(View view)
     {
         getContactList();
     }
     public void insert_click(View view)
     {
         addContact();
         Toast.makeText( this "添加成功" , Toast.LENGTH_LONG).show();
     }
     private void addContact()
     {
         ContentResolver resolver = getContentResolver();
         ArrayList<ContentProviderOperation> operations= new ArrayList<ContentProviderOperation>();
         
         Uri raw_contacts_uri = Uri.parse( "content://com.android.contacts/raw_contacts" );
         Uri data_uri = Uri.parse( "content://com.android.contacts/data" );
         
         ContentProviderOperation op1=ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
                 .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null )
                 .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null ).build();
         operations.add(op1);
         
         ContentProviderOperation op2=ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                 .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID,  0 )
                 .withValue(ContactsContract.Data.MIMETYPE,
                         ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
                 .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,  "王刚" )
                 .build();
         operations.add(op2);
         
         ContentProviderOperation op3=ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                 .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID,  0 )
                 .withValue(ContactsContract.Data.MIMETYPE,
                         ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
                 .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER,  "990009" )
                 .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_CUSTOM)
                 .build();
         
         operations.add(op3);
         
         ContentProviderOperation op4=ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                 .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID,  0 )
                 .withValue(ContactsContract.Data.MIMETYPE,
                         ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)
                 .withValue(ContactsContract.CommonDataKinds.Email.DATA,  "ping@12.com" )
                 .withValue(ContactsContract.CommonDataKinds.Email.TYPE, ContactsContract.CommonDataKinds.Email.TYPE_CUSTOM)
                 .build();
         operations.add(op4);
         
         try
             resolver.applyBatch(ContactsContract.AUTHORITY, operations); 
         catch (Exception e) { 
             e.printStackTrace();
        
         
//      ContentValues raw_values = new ContentValues();
//
//      Cursor cursor = resolver.query(raw_contacts_uri, new String[]
//      { "_id" }, null, null, null);
//      cursor.moveToLast();
//      int lastid = cursor.getInt(0);
//      int newid = lastid + 1;
//
//      raw_values.put("contact_id", newid);
//      resolver.insert(raw_contacts_uri, raw_values);
//
//      // 电话插入
//      ContentValues phonevalues = new ContentValues();
//      phonevalues.put("data1", "898989");
//      phonevalues.put("mimetype", "vnd.android.cursor.item/phone_v2");
//      phonevalues.put("raw_contact_id", newid);
//      resolver.insert(data_uri, phonevalues);
//
//      // email插入
//      ContentValues emailvalues = new ContentValues();
//      emailvalues.put("data1", "ping@126.com");
//      emailvalues.put("mimetype", "vnd.android.cursor.item/email_v2");
//      emailvalues.put("raw_contact_id", newid);
//      resolver.insert(data_uri, emailvalues);
//
//      // name插入
//      ContentValues namevalues = new ContentValues();
//      namevalues.put("data1", "王刚");
//      namevalues.put("mimetype", "vnd.android.cursor.item/name");
//      namevalues.put("raw_contact_id", newid);
//      resolver.insert(data_uri, namevalues);
     }
     private void getContactList()
     {
         ContentResolver resolver = getContentResolver();
         Uri raw_contacts_uri = Uri.parse( "content://com.android.contacts/raw_contacts" );
         Uri data_uri = Uri.parse( "content://com.android.contacts/data" );
         ll.removeAllViews();
         Cursor cursor = resolver.query(raw_contacts_uri,  null null null null );
         while (cursor.moveToNext())
         {
             String contactid = cursor.getString(cursor.getColumnIndex( "contact_id" ));
             System.out.println(contactid +  "\n" );
             if ( null != contactid)
             {
                 StringBuffer sb =  new StringBuffer( "联系人ID:" );
                 sb.append(contactid).append( " " );
                 Cursor data_cursor = resolver.query(data_uri,  null "raw_contact_id=?" new String[]
                 { contactid },  null );
                 while (data_cursor.moveToNext())
                 {
                     String data1 = data_cursor.getString(data_cursor.getColumnIndex( "data1" ));
                     String mimetype = data_cursor.getString(data_cursor.getColumnIndex( "mimetype" ));
                     System.out.println( "mimetype=" + mimetype +  ";data1=" + data1);
                     sb.append(data1).append( " " );
                 }
                 data_cursor.close();
                 TextView tv =  new TextView( this );
                 LinearLayout.LayoutParams lp =  new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
                 tv.setLayoutParams(lp);
                 tv.setText(sb.toString());
                 ll.addView(tv);
             }
         }
         cursor.close();
     }
}

这篇关于Android读写联系人数据(内容提供者应用)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1052009

相关文章

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的

Navicat数据表的数据添加,删除及使用sql完成数据的添加过程

《Navicat数据表的数据添加,删除及使用sql完成数据的添加过程》:本文主要介绍Navicat数据表的数据添加,删除及使用sql完成数据的添加过程,具有很好的参考价值,希望对大家有所帮助,如有... 目录Navicat数据表数据添加,删除及使用sql完成数据添加选中操作的表则出现如下界面,查看左下角从左

SpringBoot中4种数据水平分片策略

《SpringBoot中4种数据水平分片策略》数据水平分片作为一种水平扩展策略,通过将数据分散到多个物理节点上,有效解决了存储容量和性能瓶颈问题,下面小编就来和大家分享4种数据分片策略吧... 目录一、前言二、哈希分片2.1 原理2.2 SpringBoot实现2.3 优缺点分析2.4 适用场景三、范围分片

MySQL主从复制与读写分离的用法解读

《MySQL主从复制与读写分离的用法解读》:本文主要介绍MySQL主从复制与读写分离的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、主从复制mysql主从复制原理实验案例二、读写分离实验案例安装并配置mycat 软件设置mycat读写分离验证mycat读

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模

浅析如何保证MySQL与Redis数据一致性

《浅析如何保证MySQL与Redis数据一致性》在互联网应用中,MySQL作为持久化存储引擎,Redis作为高性能缓存层,两者的组合能有效提升系统性能,下面我们来看看如何保证两者的数据一致性吧... 目录一、数据不一致性的根源1.1 典型不一致场景1.2 关键矛盾点二、一致性保障策略2.1 基础策略:更新数