- 浏览: 124687 次
文章分类
- 全部博客 (65)
- web验证码 (0)
- 工具类 (4)
- android基础 (17)
- android通信 (1)
- JFreeChart (1)
- java基础 (5)
- android控件 (4)
- FusionCharts (1)
- android Layout (1)
- json (2)
- HTTP协议 (1)
- cmd (1)
- struts (3)
- Spring (1)
- java网络编程 (3)
- Linux (1)
- DB (5)
- Open Source (1)
- css (0)
- javascript (7)
- jquery (0)
- Socket (1)
- ajax (1)
- 整合开发 (1)
- UDP协议 (1)
最新评论
-
hy18710385392:
亲:import com.nudms.server.nurse ...
java实现打印PDF文件解决方案 -
osacar:
MyPDFPrintPage这个类能提供下?
java实现打印PDF文件解决方案 -
井底之龙:
请问楼主定义的保存Button从开始到最后都没有从xml文件中 ...
Android之SharedPreferences的使用 保存用户设置 -
lohasle:
liangzb0614 写道你好,求一个MyPDFPrintP ...
java实现打印PDF文件解决方案 -
liangzb0614:
你好,求一个MyPDFPrintPage 类!拜托了liang ...
java实现打印PDF文件解决方案
本文主要使用contentprovider实现读取写入联系人数据,初步学习contentprovider的用法,摘自李刚的《疯狂android》
contentprovider是不同应用程序之间进行数据交换的标准API,contentprovider以某种Uri的形式对外提供数据,允许其他应用访问或修改数据;其他应用程序使用contentresolver根据Uri去访问操作指定数据。
如果把contentprovider当成一个“网站”来看,那木如何完整开发一个contentprovider呢?步骤很简单:
1.定义自己的contentprovider类,该类需要继承android提供的contentprovider基类。
2.想android系统注册这个“网站”,也就是早androidmanifest.xml文件中注册这个contentprovider,就像注册activity一样,注册contentprovider时需要为它绑定一个域名。
android系统提供了contacts应用程序来管理联系人,而且android系统还为联系人管理提供contentprovider,这就允许其他应用程序以contentprovider来管理联系人数据。
android系统对联系人管理contentprovider的几个Uri如下
ContactsContract.Contract.CONTENT_Uri:管理联系人的Uri
ContactsContract.CommonDataKinds.Phone.CONTENT_URI:管理联系人的电话的Uri.
ContactsContract.CommonDataKinds.Email.Content_URI: 管理联系人的E-mail的Uri
知道联系人管理contentprovider的Uri之后,接下来就可在应用程序中通过contentresolver去操作系统的联系人数据了。
下面示例程序中包含两个按钮,一个按钮用于查询系统的联系人数据,一个按钮用于添加插入联系数据,具体代码如下:
1. main布局文件,由于测试学习使用,没有具体设计布局样式
2.result布局文件
3.实现代码如下:
上面程序需要读取、添加联系人信息,因此需要在androidmanifest.xml中为该应用程序授权
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
项目代码见附件
contentprovider是不同应用程序之间进行数据交换的标准API,contentprovider以某种Uri的形式对外提供数据,允许其他应用访问或修改数据;其他应用程序使用contentresolver根据Uri去访问操作指定数据。
如果把contentprovider当成一个“网站”来看,那木如何完整开发一个contentprovider呢?步骤很简单:
1.定义自己的contentprovider类,该类需要继承android提供的contentprovider基类。
2.想android系统注册这个“网站”,也就是早androidmanifest.xml文件中注册这个contentprovider,就像注册activity一样,注册contentprovider时需要为它绑定一个域名。
android系统提供了contacts应用程序来管理联系人,而且android系统还为联系人管理提供contentprovider,这就允许其他应用程序以contentprovider来管理联系人数据。
android系统对联系人管理contentprovider的几个Uri如下
ContactsContract.Contract.CONTENT_Uri:管理联系人的Uri
ContactsContract.CommonDataKinds.Phone.CONTENT_URI:管理联系人的电话的Uri.
ContactsContract.CommonDataKinds.Email.Content_URI: 管理联系人的E-mail的Uri
知道联系人管理contentprovider的Uri之后,接下来就可在应用程序中通过contentresolver去操作系统的联系人数据了。
下面示例程序中包含两个按钮,一个按钮用于查询系统的联系人数据,一个按钮用于添加插入联系数据,具体代码如下:
1. main布局文件,由于测试学习使用,没有具体设计布局样式
<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=".MainActivity" > <Button android:id="@+id/querybtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="query"/> <Button android:id="@+id/addbtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="add"/> <EditText android:id="@+id/name" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="text"/> <EditText android:id="@+id/phone" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="phone"/> <EditText android:id="@+id/email" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="textEmailAddress"/> </LinearLayout>
2.result布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ExpandableListView android:id="@+id/list" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout>
3.实现代码如下:
import java.util.ArrayList; import android.app.Activity; import android.app.AlertDialog; import android.content.ContentUris; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.provider.ContactsContract; import android.provider.ContactsContract.CommonDataKinds.Email; import android.provider.ContactsContract.CommonDataKinds.Phone; import android.provider.ContactsContract.CommonDataKinds.StructuredName; import android.provider.ContactsContract.Contacts.Data; import android.provider.ContactsContract.RawContacts; import android.view.Gravity; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.BaseExpandableListAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ExpandableListAdapter; import android.widget.ExpandableListView; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity { private Button querybtn, addbtn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); querybtn = (Button)findViewById(R.id.querybtn); addbtn = (Button)findViewById(R.id.addbtn); querybtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //定义两个LIST来封装系统的联系人信息、指定联系人的电话号码,email等详情 final ArrayList<String> names = new ArrayList<String>(); final ArrayList<ArrayList<String>> details = new ArrayList<ArrayList<String>>(); //使用contentresolver查找联系人的数据 Cursor cursor = getContentResolver().query( ContactsContract.Contacts.CONTENT_URI, null, null, null, null); while(cursor.moveToNext()){ //获取联系人ID String contactId = cursor.getString(cursor .getColumnIndex(ContactsContract.Contacts._ID)); String name = cursor.getString(cursor .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); names.add(name); //使用contentresolver查找联系人的电话号码 Cursor phones = getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + contactId, null, null); ArrayList<String> detail = new ArrayList<String>(); //遍历查询结果,获取该联系人的多个电话号码 while(phones.moveToNext()){ String phoneNumber = phones.getString(phones. getColumnIndex(ContactsContract. CommonDataKinds.Phone.NUMBER)); detail.add("电话号码:" + phoneNumber); } phones.close(); //使用contentresolver查找联系人的email的地址 Cursor emails = getContentResolver().query( ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + "=" + contactId, null, null); while(emails.moveToNext()){ String emailAdddress = emails.getString(emails .getColumnIndex(ContactsContract .CommonDataKinds.Email.DATA)); detail.add("邮件地址:" + emailAdddress); } emails.close(); details.add(detail); } cursor.close(); //加载result.xml界面布局代表的视图 View resultDialog = getLayoutInflater().inflate( R.layout.result, null); //获取resultDialog中ID 为list的ExpandableListView ExpandableListView list = (ExpandableListView)resultDialog.findViewById(R.id.list); ExpandableListAdapter adapter = new BaseExpandableListAdapter() { @Override public Object getChild(int groupPosition, int childPosition) { return details.get(groupPosition).get(childPosition); } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { TextView textView = getTextView(); textView.setText(getChild(groupPosition, childPosition).toString()); return textView; } @Override public int getChildrenCount(int groupPosition) { return details.get(groupPosition).size(); } @Override public Object getGroup(int groupPosition) { return names.get(groupPosition); } @Override public int getGroupCount() { return names.size(); } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { TextView textView = getTextView(); textView.setText(names.get(groupPosition).toString()); return textView; } @Override public boolean hasStableIds() { return true; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } private TextView getTextView(){ AbsListView.LayoutParams lp = new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); TextView textView = new TextView(MainActivity.this); textView.setLayoutParams(lp); textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT); textView.setTextSize(20); return textView; } }; list.setAdapter(adapter); new AlertDialog.Builder(MainActivity.this) .setView(resultDialog) .setPositiveButton("确定", null) .show(); } }); addbtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String name = ((EditText)findViewById(R.id.name)).getText().toString(); String phone = ((EditText)findViewById(R.id.phone)).getText().toString(); String email = ((EditText)findViewById(R.id.email)).getText().toString(); //创建一个空的contentvalues ContentValues values = new ContentValues(); //向rawContacts.Content_URI执行一个空值插入,目的是获取系统返回的rawContactId Uri rawContactUri = getContentResolver().insert(RawContacts.CONTENT_URI, values); long rawContactId = ContentUris.parseId(rawContactUri); values.clear(); values.put(Data.RAW_CONTACT_ID, rawContactId); //设置内容类型 values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); //设置联系人的名字 values.put(StructuredName.GIVEN_NAME, name); //向联系人Uri添加联系人名字 getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values); values.clear(); values.put(Data.RAW_CONTACT_ID, rawContactId); values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); //设置联系人的电话号码 values.put(Phone.NUMBER, phone); //设置电话类型 values.put(Phone.TYPE, Phone.TYPE_MOBILE); //向联系人电话号码Uri添加电话号码 getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values); values.clear(); values.put(Data.RAW_CONTACT_ID, rawContactId); values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); //设置联系人的email地址 values.put(Email.DATA, email); //设置该电子邮件的类型 values.put(Email.TYPE, Email.TYPE_WORK); //向联系人email uri添加email数据 getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values); Toast.makeText(MainActivity.this, "联系人数据添加成功", Toast.LENGTH_SHORT).show(); } }); } }
上面程序需要读取、添加联系人信息,因此需要在androidmanifest.xml中为该应用程序授权
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
项目代码见附件
- ContenProvider.7z (879.5 KB)
- 下载次数: 6
发表评论
-
Android 中OpenGL的使用
2013-06-18 22:48 2437android为openGL ES支持提供了GLSurface ... -
android 之GestureOverlayView手势识别
2013-05-28 00:18 2368android 之GestureOverlayView ... -
android 之ViewPager左右滑动切换界面
2013-05-26 23:49 2520这是谷歌官方给我们提供的一个兼容低版本安卓设备的软件包,里面包 ... -
Android之SharedPreferences的使用 保存用户设置
2013-05-18 18:56 2407SharedPreferences是Android平台上一个轻 ... -
android手机内存中的文件操作
2013-05-18 08:47 1307android为手机存储范围内的文件操作提供了openFile ... -
使用contentprovider共享生词本数据
2013-04-06 10:49 1213摘自李刚<疯狂android>备份学习使用 首先 ... -
android读写XML
2013-01-08 11:08 997详细代码看附件! 布局文件: <RelativeL ... -
android检测网络是否正常
2012-05-17 23:18 1822按照惯例,先上图后代码 在实际开发中,尤其是在网络应用 ... -
Android Handler详解
2012-05-16 10:55 1411/*** * Handler的定义: ... -
android之OnScrollListener 下拉刷新
2012-05-12 20:47 2770先看看效果图吧 1.首先创建一个头部xml文件 < ... -
android之WebView的使用
2012-05-09 23:50 1250为了先体验一下效果,截了一个图 main.xml < ... -
android之PopupWindow
2012-05-03 15:57 2554用的豌豆荚截图,本来是个动画的,每个过程都有几张,大概 ... -
android之OnGestureListener实现图片的左右滑动
2012-04-24 22:07 3392先来看看效果图吧 welcome_glide.xml ... -
android解析json(2)
2012-04-17 23:57 1468两种android解析json的例子 第一个事件是androi ... -
JSON在android中的应用(1)
2012-04-16 23:47 1315android框架已经为我们集成了解析json的包 先一个简 ... -
android实现淡入淡出欢迎界面
2012-03-03 21:34 4433本例子会实现想手机QQ和酷狗那样的淡入淡出的欢迎界面 im ...
相关推荐
ContentProvider使得应用程序可以将自己的数据结构公开,让其他应用能够安全地读取或写入这些数据,实现了不同应用间的资源共享。本Demo主要展示了如何创建并使用一个简单的ContentProvider。 首先,我们需要了解...
对联系人进行操作时,需要在AndroidManifest.xml中声明相应的权限,如`READ_CONTACTS`和`WRITE_CONTACTS`,以允许应用读取和写入联系人数据。 五、自定义ContentProvider 虽然系统提供了联系人ContentProvider,但...
在这个实例中,我们将讨论如何使用ContentProvider读取手机上的联系人信息。 首先,为了能够访问手机联系人,必须在AndroidManifest.xml文件中添加权限声明。以下两行代码分别用于读取和写入联系人: ```xml <uses...
应用B需要获取读取或者写入权限,这取决于ContentProvider在注册时设置的权限。如果应用A希望只对特定的应用开放数据,还可以通过在ContentProvider中实现自定义的授权逻辑来控制数据访问。 为了简化数据访问,...
在标题中提到的“共享生词本数据”,我们可以理解为一个应用需要将生词存储在一个中心化的数据存储位置,并允许其他应用读取或写入这些生词。ContentProvider恰好提供了这样的功能,它可以实现数据的读写操作,并...
例如,在 Android 中,联系人、短信、图片等数据都可以通过 ContentProvider 暴露给其他应用程序。 Uri 的使用:Uri 是一种统一资源标识符,用于标识不同的数据资源。ContentProvider 使用 Uri 来定义数据的访问...
应用B只需知道应用A的ContentProvider的URI,就可以通过ContentResolver发起请求,实现文件的读取或写入。 2. Intent与ContentProvider:可以通过Intent的`setData()`方法设置目标URI,然后使用`...
ContentProvider作为一个桥梁,使得其他应用可以读取或写入原本私有的数据。在这个"ContentProvider示例"中,我们将深入理解ContentProvider的工作原理及其重要性。 一、ContentProvider概述 ContentProvider是...
在AndroidManifest.xml中,由于涉及到读取和写入联系人,需要添加相应的权限: ```xml <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android....
在目标应用中,我们可以通过ContentResolver来访问`contentprovider_one`提供的联系人数据。首先,构造一个指向ContentProvider的URI,这通常是以"content://"开头的字符串,接着是ContentProvider的authority,例如...
首先,ContentProvider是Android系统提供的一种机制,允许应用将自己的数据结构公开,使得其他应用可以读取或写入这些数据,而无需直接访问应用的内部数据结构。这种机制遵循了Android系统的安全模型,确保了数据的...
Contacts Provider是Android内置的一个ContentProvider实例,负责处理联系人数据。 3. **权限管理**: 在访问通讯录之前,应用必须声明相应的权限。在AndroidManifest.xml中添加`<uses-permission>`标签,如`<uses...
例如,访问联系人数据时,URI可能是`ContactsContract.Contacts.CONTENT_URI`。 4. **执行操作**:使用ContentResolver调用`query()`, `insert()`, `update()`, `delete()`等方法,传入对应的URI和参数,执行数据...
`ContentReader`则用于从ContentProvider读取数据。它同样使用ContentResolver,但调用query()方法。query()返回一个Cursor对象,可以遍历查询结果。例如: ```java ContentResolver resolver = getContentResolver...
本示例通过两个工程,一个负责写入数据,另一个负责读取数据,展示了ContentProvider的基本用法和功能。 首先,我们要理解ContentProvider的核心概念。ContentProvider是Android系统中用于在不同应用间共享数据的...
例如,读取联系人数据需要`READ_CONTACTS`权限,写入联系人数据则需要`WRITE_CONTACTS`权限。开发者需要在AndroidManifest.xml中添加相应的权限声明。 综上所述,通讯录的实现涉及了ContentProvider和...
在AndroidManifest.xml中,`<provider>`标签的`readPermission`和`writePermission`属性用于设置读取和写入权限。 五、优化与性能 1. **异步操作**:对于耗时的操作,如大量数据的读写,可考虑使用异步任务或...
通过ContentProvider,不同应用可以安全地读取和写入这些数据,而无需直接暴露底层数据存储的细节。这对于保护用户隐私和维护应用间的数据隔离至关重要。 在`...
总的来说,通过ContentProvider,我们可以方便地获取和操作Android设备上的联系人数据。注意,在实际使用时,一定要处理好权限问题,确保应用有读取联系人的权限,否则可能会出现运行时权限问题。此外,为了提高性能...