之前的教程(Android平台上四种保存数据的方法)中有讨论过Android平台上四种存储数据的方法以及需要着重注意的特性。Android严格控制了数据的安全使用规范,为此建立在各种存储模块中的数据依然是私有于其相对应的程序。有简单提及应用Content Providers来实现多个Applications共享数据,并没有深入讲解具体的执行过程。这个教程的目的就是对这个话题的延展,一步一步了解使用Content Providers的方法和规范。
一, 如何使用 Content Provider
Content Provider是专门用于数据存储的类,是Android平台处理存取数据操作的核心。针对不同的应用模块都有各自的Content provider总类,下边是用户经常接触到的几个典型Content Provider应用:
- Content Provider Name : Intended Data
- Browser : Browser bookmarks, Browser history, etc.
- CallLog : Missed calls, Call datails, etc.
- Contacts : Contact details
- MediaStore : Media files such as audio, Video and Images
- Settings : Device Settings and Preferences
调用Content Provider资源的标准URI结构:
<standard_prefix>://<authority>/<data_path>/<id>
例如:
1) 取得浏览器所有“书签”信息: content://browser/bookmarks
2) 取得系统通讯录中的信息: content://contacts/people (如果取得某一个特定通讯记录,在路径URI的末端指定一个ID号:content://contacts/people/5
通过一个例子来具体的了解如何应用Content Provider调取资源:
目的:访问Call Log数据池,读取所有与“呼叫”相关的记录信息
步骤一,
应用Eclipse作为开发IDE创建一个新的项目,根据自己的爱好来随意命名项目,例如这个例子的名字叫:“Hello_CP_Example”,
步骤二,
在文件AndroidManifest中添加 “READ_CONTACTS” permission标签:
<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>
步骤三,
完成主程序源代码 <Java>:
01.
public
class
helloCP
extends
Activity {
02.
/** Called when the activity is first created. */
03.
@Override
04.
public
void
onCreate(Bundle savedInstanceState) {
05.
super
.onCreate(savedInstanceState);
06.
setContentView(R.layout.main);
07.
08.
Uri allCalls = Uri.parse(
"content://call_log/calls"
);
09.
Cursor c = managedQuery(allCalls,
null
,
null
,
null
,
null
);
10.
if
(c.moveToFirst()) {
11.
do
{
12.
String callType =
""
;
13.
switch
(Integer.parseInt(c.getString(
14.
c.getColumnIndex(Calls.TYPE))))
15.
{
16.
case
1
: callType =
"Incoming"
;
17.
break
;
18.
case
2
: callType =
"Outgoing"
;
19.
break
;
20.
case
3
: callType =
"Missed"
;
21.
}
22.
Log.v(
"AndroidRes CP"
,
23.
c.getString(c.getColumnIndex(Calls._ID)) +
", "
+
24.
c.getString(c.getColumnIndex(Calls.NUMBER)) +
", "
+
25.
callType) ;
26.
}
while
(c.moveToNext());
27.
}
28.
}
29.
}
- Uri allCalls = Uri.parse(”content://call_log/calls”); //定义访问Call_log的URI路径
- ManagedQuery(); //将上边所得到的URI作为参数调用ManagedQuery()方法来取得Cursor,如果程序处于停止状态时将自动管理释放相关资源,系统重新启动后也将自动找回相关资源。这是一个管理资源的便捷方法。查看站内文档 或者 查看官方文档。
- Integer.parseInt(c.getString(c.getColumnIndex(Calls.TYPE))); //这个方法将返回代表呼叫类型的整型数值(1: Incoming Call; 2: Outgoing Call; 3: Missed Call;)
步骤四,
运行程序后,通过Eclipse中的DDMS可以看到当前的记录输出信息:
- 04-16 17:49:18.399: VERBOSE/AndroidRes CP(222): 1, 1362×××0277, Incoming
- 04-16 17:49:18.399: VERBOSE/AndroidRes CP(222): 2, 1362×××0277, Outgoing