Android自学之路--ContentProvider

A)MainActivity部分的代码1 package com.example.cms.systemcontentprovider;
  2
  3 import android.app.ExpandableListActivity;
  4 import android.content.ContentUris;
  5 import android.content.ContentValues;
  6 import android.database.Cursor;
  7 import android.net.Uri;
  8 import android.provider.ContactsContract;
  9 import android.support.v7.app.AlertDialog;
 10 import android.support.v7.app.AppCompatActivity;
 11 import android.os.Bundle;
 12 import android.view.Gravity;
 13 import android.view.SurfaceHolder;
 14 import android.view.View;
 15 import android.view.ViewGroup;
 16 import android.widget.AbsListView;
 17 import android.widget.BaseExpandableListAdapter;
 18 import android.widget.Button;
 19 import android.widget.EditText;
 20 import android.widget.ExpandableListAdapter;
 21 import android.widget.ExpandableListView;
 22 import android.widget.TextView;
 23 import android.widget.Toast;
 24
 25 import org.w3c.dom.Text;
 26
 27 import java.util.ArrayList;
 28
 29 public class MainActivity extends AppCompatActivity {
 30     private Button searchButton;
 31     private Button addButton;
 32     private EditText inputname;
 33     private EditText inputnummber;
 34     private EditText inputemail;
 35
 36     @Override
 37     protected void onCreate(Bundle savedInstanceState) {
 38         super.onCreate(savedInstanceState);
 39         setContentView(R.layout.activity_main);
 40         searchButton= (Button) findViewById(R.id.searchButton);
 41         addButton= (Button) findViewById(R.id.addButton);
 42         inputname= (EditText) findViewById(R.id.inputname);
 43         inputnummber= (EditText) findViewById(R.id.inputnumber);
 44         inputemail= (EditText) findViewById(R.id.inputemail);
 45
 46         searchButton.setOnClickListener(new View.OnClickListener() {
 47             @Override
 48             public void onClick(View v) {
 49                 //定义两个List来封装里联系人信息 指定联系人的电话号码 Email等详情
 50                 final ArrayList<String> names=new ArrayList<String>();
 51                 final ArrayList<ArrayList<String>> details=new ArrayList<ArrayList<String>>();
 52                 //使用ContentResolver获取系统所有联系人
 53                 Cursor cursor=getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,null,null,null,null);
 54                 //遍历查询结果
 55                 while(cursor.moveToNext()){
 56                     //获取联系人的姓名
 57                     String name=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
 58                     names.add(name);
 59                     //获取联系人对应的ID号
 60                     String contactId=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
 61                     //查找该联系人的电话号码
 62                     Cursor phones=getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"="+contactId,null,null);
 63                     //将每个联系人的信息封装成一个LIST
 64                     ArrayList<String>detail=new ArrayList<String>();
 65                     //可能一个联系人都多个电话号码 所以需要遍历
 66                     while(phones.moveToNext()){
 67                         //获取查询结果中电话号码列中的数据
 68                         String phoneNumber=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
 69                         detail.add("电话号码:"+phoneNumber);
 70                     }
 71                     phones.close();
 72                     //查找该联系人的Email信息
 73                     Cursor emails=getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,null,ContactsContract.CommonDataKinds.Email.CONTACT_ID+"="+contactId,null,null);
 74                     while(emails.moveToNext()){
 75                         String emailsAddress=emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
 76                         detail.add("邮件地址:"+emailsAddress);
 77                     }
 78                     emails.close();
 79                     details.add(detail);
 80                 }
 81                 cursor.close();
 82
 83                 //加载布局文件
 84                 View resultDialog=getLayoutInflater().inflate(R.layout.result,null);
 85                 ExpandableListView list= (ExpandableListView) resultDialog.findViewById(R.id.list);
 86
 87                 ExpandableListAdapter adapter=new BaseExpandableListAdapter() {
 88                     //返回所有分组的数目(即联系人的数目)
 89                     @Override
 90                     public int getGroupCount() {
 91                         return names.size();
 92                     }
 93
 94                     //返回groupPosition对应位置的联系人底下包含的电话号码数和邮件数
 95                     @Override
 96                    public int getChildrenCount(int groupPosition) {
 97                         return details.get(groupPosition).size();
 98                     }
 99
100                     //返回groupPosition对应的联系人分组
101                     @Override
102                     public Object getGroup(int groupPosition) {
103                         return names.get(groupPosition);
104                     }
105                     //返回groupPosition对应联系人的childPosition位置的对应信息
106                     @Override
107                     public Object getChild(int groupPosition, int childPosition) {
108                         return details.get(groupPosition).get(childPosition);
109                     }
110                     @Override
111                     public long getGroupId(int groupPosition) {
112                         return groupPosition;
113                     }
114
115                     @Override
116                     public long getChildId(int groupPosition, int childPosition) {
117                         return childPosition;
118                     }
119                     private TextView getTextView(){
120                         TextView textView=new TextView(MainActivity.this);
121                         AbsListView.LayoutParams lp=new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,64);
122                         textView.setLayoutParams(lp);
123                         textView.setGravity(Gravity.CENTER_VERTICAL|Gravity.LEFT);
124                         textView.setPadding(36,0,0,0);
125                         textView.setTextSize(20);
126                         return textView;
127                     }
128                     //决定每个联系人分组选项外观的方法
129                     @Override
130                     public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
131                         TextView textView=getTextView();
132                         textView.setText(getGroup(groupPosition).toString());
133                         return textView;
134                     }
135                     //决定每个子选项外观的方法
136                     @Override
137                     public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
138                         TextView textView=getTextView();
139                         textView.setText(getChild(groupPosition,childPosition).toString());
140                         return textView;
141                     }
142
143                     @Override
144                     public boolean hasStableIds() {
145                         return true;
146                     }
147
148                     @Override
149                     public boolean isChildSelectable(int groupPosition, int childPosition) {
150                         return true;
151                     }
152                 };
153                 list.setAdapter(adapter);
154                 new AlertDialog.Builder(MainActivity.this).setView(resultDialog).setPositiveButton("确定",null).show();
155             }
156         });
157
158         //为add添加联系人按钮绑定监听事件
159         addButton.setOnClickListener(new View.OnClickListener() {
160             @Override
161             public void onClick(View v) {
162                 //获取用户输入的联系人信息
163                 String name=inputname.getText().toString();
164                 String number=inputnummber.getText().toString();
165                 String email=inputemail.getText().toString();
166                 //创建一个空的ContentValues  然后向RawContacts.CONTENT_URI执行一个空值插入 这样就能返回一个rawContactId 从而得到插入的位置
167                 ContentValues values=new ContentValues();
 

168                 Uri rawContactUri=getContentResolver().insert(ContactsContract.RawContacts.CONTENT_URI,values);
169                 long rawContactId= ContentUris.parseId(rawContactUri);
170                 values.clear();
171                 //设置联系人姓名模块
172                 values.put(ContactsContract.Data.RAW_CONTACT_ID,rawContactId);
173                 values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
174                 values.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME,name);
175                 getContentResolver().insert(ContactsContract.Data.CONTENT_URI,values); //向联系人URI添加联系人名字
176
177                 values.clear();
178                 //设置联系人电话号码模块
179                 values.put(ContactsContract.Data.RAW_CONTACT_ID,rawContactId);
180                 values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
181                 values.put(ContactsContract.CommonDataKinds.Phone.NUMBER,number);
182                 values.put(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE);//设置电话号码类型
183                 getContentResolver().insert(ContactsContract.Data.CONTENT_URI,values);
184
185                 values.clear();
186                 //设置联系人邮件地址模块
187                 values.put(ContactsContract.Data.RAW_CONTACT_ID,rawContactId);
188                 values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE);
189                 values.put(ContactsContract.CommonDataKinds.Email.DATA,email);
190                 values.put(ContactsContract.CommonDataKinds.Email.TYPE, ContactsContract.CommonDataKinds.Email.TYPE_WORK);
191                 getContentResolver().insert(ContactsContract.Data.CONTENT_URI,values);
192                 Toast.makeText(MainActivity.this,"添加联系人成功", Toast.LENGTH_SHORT).show();
193             }
194         });
195     }
196 }

B)activity_main.xml 布局文件代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.cms.systemcontentprovider.MainActivity">
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/searchButton"
        android:text="查看所有联系人"
        />
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/inputname"
        android:hint="请输入联系人的姓名"
        />
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/inputnumber"
        android:hint="请输入联系人的电话号码"
        />
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/inputemail"
        android:hint="请输入联系人的Email"
        />
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/addButton"
        android:layout_below="@+id/searchButton"
        android:text="添加联系人"
        />
</LinearLayout>

 C)result.xml代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ExpandableListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/list"
        ></ExpandableListView>

</LinearLayout>
D)AndroidManifest.xml代码
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.cms.systemcontentprovider">
    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <uses-permission android:name="android.permission.WRITE_CONTACTS"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity"
            android:exported="true"
            >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

        </activity>
    </application>

</manifest>
				
时间: 2024-08-27 07:48:46

Android自学之路--ContentProvider的相关文章

.NET程序员的Android自学之路(一):Android开发环境的准备

写在前面的话:话说,笔者是一个.NET程序员,技术水平可能还不入流,这两三年一直在关注WP,可惜诺基亚"一蹶不振",没有迎来WP的时代,现在只好投入Android阵营.其实也就是今天笔者刚开始学习Android的,计划将学习的过程记录下来,一是方便自己回顾,二是分享于有需要的人,闲话少提,开始今天的内容. 一.开发环境下载Java环境JDK:Oracle官网下载地址JDK7Android环境SDK:http://developer.android.com/sdk/index.html,

Android自学之路——Service与IntentService

A)MainActivity部分的代码1 package com.example.cms.intentservice; 2 3 import android.content.Intent; 4 import android.support.v7.app.AppCompatActivity; 5 import android.os.Bundle; 6 import android.view.View; 7 import android.widget.Button; 8 9 public class

Android自学之路——Service与Activity通信

A)MainActivity 类的代码 1 package com.example.cms.service; 2 3 import android.app.Service; 4 import android.content.ComponentName; 5 import android.content.Intent; 6 import android.content.ServiceConnection; 7 import android.os.IBinder; 8 import android.

小猪的Android入门之路 Day 8 part 2

小猪的Android入门之路 Day 8 part 2 Android网络编程浅析--Android访问网络资源 --转载请注明出处:coder-pig 本节引言: 在part 1中我们学习了网络交互中用得较多的xml文件的相关概念,以及在Android中常用的 解析XML三种不同形式,分别SAX,DOM,Pull三种不同的解析方式;而在part 2中我们将会 讲解我们的应用如何去获取网络上的资源,分别是图片,HTML代码,XML代码和JSON数据; 好了,废话就这么多,开始本节的课程吧!从这p

【转】JAVA自学之路

JAVA自学之路 一: 学会选择 为了就业,不少同学参加各种各样的培训. 决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机.嵌入式.游戏.3G.测试等. 那么究竟应该选择什么方向呢? 我的意见是,不要太过相信各种培训机构或是抢手文章的说法(包括我),当你要走向社会的时候,就不要再把自己当成学生,不要把自己的将来交给别人,学会运用自己的眼睛去观察,去了解这个世界吧. 每个培训机构都会宣传自己的好处,并不能说明大的趋势. 一些新闻文章很有可能是枪手写的,不必太过相信.国外背景的

小猪的Android入门之路 Day 7 part 4

小猪的Android入门之路 Day 7 part 4 Android的数据存储与访问之--ContentProvider(内容提供者)                                   ---转载请注明出处:coder-pig 本节引言: 在前面的学习中,我们已经学习了一些存储数据的方式,而这些都是可以共享的,比如文件,我们可以把操作 模式设置为Context.MODE_WORLD_READABLE 或Context.MODE_WORLD_WRITEABLE,其他应用 就可以

android 自学日记(一)

android 自学日记(一) 说起日记,记忆还是小学时候学校里的作业,只记得当时通篇都是流水账,例如"几点起床,去哪里玩了,干了啥坏事什么的(额,这不能写!)...",反正都是应付学校作业,胡乱凑字数的.主要那还是自知没啥写作的天赋,上学时候的作文都是挤牙膏似地才能凑满要求的800字.理所当然的文科不好的人,理科一般都还不错,我也在偏科厉害的情况下进入了一个三流工科大学. 之后没有了这些令人痛苦的要求之后,基本就是和写东西无缘了,那是能不写就不写,包括当时的毕业论文,那是头疼了好几个

小猪的Android入门之路——目录(持续更新)

小猪的Android入门之路专栏目录                     --转载请注明:coder-pig 欢迎转载,请乎用于商业用途! 写本专栏的一些感慨:      小猪的Android入门之路写了已经有一段时间了,记录的是小猪在Android学习路上的一些点点 滴滴,记得第一篇是2014.7.31号写的,当时正好是放暑假,脑子一热就决定写一个这样的系列了, 自学之路并不容易,你想想突然要你去接触一门你完全不会的东西,有多难,记得刚学Android就 加了几个Android开发群,在群

【Android自学日记】关于Bitmap的理解和使用-不完整版

最近的Android自学刚好学习到异步线程的使用,对于开启异步线程加载网络图片中用到的Bitmap有点小蒙逼,这到底是个啥???所以我就自信的打开了百度!!以下就是我学习到的知识! 百度定义: 位图文件(Bitmap),扩展名可以是.bmp或者.dib.位图是Windows标准格式图形文件,它将图像定义为由点(像素)组成,每个点可以由多种色彩表示,包括2.4.8.16.24和32位色彩.例如,一幅1024×768分辨率的32位真彩图片,其所占存储字节数为:1024×768×32/(8*1024)