瞿苏
(江苏联合职业技术学院扬州商务分院, 江苏 扬州 225000)
基于Android的ContentProvider实现数据共享的研究与探讨
瞿苏
(江苏联合职业技术学院扬州商务分院, 江苏 扬州 225000)
由于Android中没有提供所有应用共同访问的公共存储区域,Android系统中提供了ContentProvider类,该类用于保存和获取数据,并使其对所有应用程序可见。本文主要介绍了ContentProvider基本概念、ContentProvider的常用方法以及利用Content Provider获取Android的用户隐私的方法。
Android;ContentProvider;ContentResolver;URI
ContentProvider与 Activity、Service、Broadcast-Receiver是Android应用的四大基本组成部分,这四个组件都需要配置在清单文件AndroidManifest.xml中。Content providers用于存储和检索数据,通过它可以让所有的应用程序访问到,这也是应用程序之间唯一共享数据的方法。
ContentProvider解决了Android系统中由于文件数据和数据库数据私有的而导致多个应用程序不能进行数据交换的情况。一个程序可以通过ContentProvider类实现了一组标准的方法抽象接口将数据完全暴露。因此,ContentProviders就像一个暴露的“数据库”,外界可获取其提供的数据,ContentProvider是应用程序之间唯一共享数据的方法,Android系统的许多常用应用程序都应用了这种机制,比如通讯录应用可以为别的应用提供联系人信息。
(一)数据模型
通过简单的表格,一行为一条记录,一列为一个字段,表示某一类型和含义的数据,每条记录包含一个数值型的_ID字段(注意:ID字段前还包含一条下划线),用于在表格中唯一标识该记录。ID可以匹配相关表格中的记录,如表格A中查到某人电话,可在表格B查到某人的照片。
(二)URI的用法
ContentProvider可以实现数据共享。Content-Provider是定义获取数据的统一方式,使用这种机制的数据可以被其他的应用程序获取。这是Android系统定义的获取其他应用程序中数据的唯一方式。ContentProvider使用URI来唯一标识数据集,URI以content://作为前缀,表示该数据由ContentProvider来管理,如图1所示:
图1 Uri组成图
Uri及数据模型是ContentProvider的两个重要的因素。访问者访问ContentProvider中的数据时,操作的是数据表。对于Content-Provider,数据表中的每一条记录都有一个作为唯一标识的_ID字段。Uri是ContentProvider的每一个数据集的唯一标识,并且代表了要操作的数据。
(三)预定义ContentProvider
Android系统默认把一些数据(如短信、通讯录、拍摄的照片、拍摄的视频等)封装在ContentProvider中。拥有访问ContentProvider权限的应用可以访问ContentProvider中封装的数据。可以通过两种方式让应用的数据和其他应用共享:(1)自己创建ContentProvider;(2)在已有的ContentProvider中添加用于共享的数据。
Android.provider包中含有常用数据类型的预定义的ContentProvider。开发人员可以查询这些provider以获得其中包含的信息(尽管有些需要适当的权限来读取数据)。Android系统提供的常见ContentProvider说明有Browser.CallLog,Contacts, LiveFolders,MediaStore,Setting,SyncStateContract, UseDictionary。
(四)自定义Content Provider
如果开发人员希望共享自己的数据,则有以下两个选择:创建自定义的Content Provider(一个Content Provider类的子类)、如果有预定义的Provider,管理相同的数据类型并且有写入权限,则可以向其中增加数据。
自定义Content Provider的过程为:(1)建立数据存储系统,可通过SQLiteDatabase类管理数据库;(2)继承Content Provider类提供数据访问方式,可使用ContentResolver和Cursor类来共享数据。(3)声明Content Provider,可在AndroidManifest.xml文件中定义
(五)ContentProvider工作原理
程序员一般不直接操作ContentProvider对象,一般都是通过ContentResolver对象来操作Content-Provider对象,其工作原理如图2所示。
图2 ContentProvider工作原理
ContentProvider和 ContentResolver之间的关系,如图3所示。
图3 ContentProvider和ContentResolver关系图
ContentProvider负责把文件、SQLites数据库封装起来,并且通过接口把数据暴露给其他应用。ContentResolver能够操作由Uri指定的ContentProvider中的数据。实际上,ContentResolver对指定的Uri的增加、删除、修改、查询等数据操作,是由指定的Uri对应的ContentProvider实现的。如图3所示,应用A通过ContentResolver调用应用B Content-Provider中的数据,ContenResolver在数据操作时指定了要操作的Uri,Android系统找到Uri对应的ContentProvider组件,最终由ContentProvider完成对底层数据的操作。应用A调用ContentResollver的增加数据、更新数据、删除数据及查询数据的方法时,实际上调用了指定的Uri对应的ContentProvider的增加数据、更新数据、删除数据及查询数据的方法。如果要使用ContentProvider就需要在Android-Manifest.xml清单文件中配置。
在清单文件的〈application.../>元素中添加子元素〈provider.../>。配置代码片段如下:
Name:用于该ContentProvider的实现类的类名指定。
Authorities:用于对唯一识别ContentProvider的uri指定。
experted:用于对是否允许其他应用操作该ContentProvider指定。如果该属性值为true,则允许其他应用调用该ContentProvider。
(一)查询数据
ContentResolver.query()或Activity.managed Query ()这两种方法是查询ContentProvider中的数据的方法,在查询数据时,需提供标识该ContentProvider的URI、需要查询的数据字段名称和字段中的数据类型。对于查询特定的记录时,需提供该记录的ID值。查询都返回Cusor对象,但两种方法的区别是:managedQuery依赖activity,由Activtiy来帮忙管理cursor,而getContentResolver获取cursor,之后修改查询的那些方法都是基本的数据库操作的方法,就是封装了。
获得数据使用Cusor对象处理,它能向前或向后遍历整个结果集。开发人员可以使用Cusor对象来读取数据,而增加、修改和删除数据则必须使用ContentResolver对象。
(二)增加记录
通过ContentResolver.insert()方法向Content-Provider中增加记录,其过程为(1)在ContentValues对象中建立键值对映射;(2)调用ContentResolver.insert();(3)传递Provider的URI参数和ContentValues映射;(4)返回新记录ID的URI。
(三)增加新值
程序员向存在的记录中增加新信息或修改信息,增加记录到数据库的最佳方式是增加保存新数据的表名到代表记录的URI,然后使用组装好的URI来增加数据。每个表格以及常量的方式提供名称。
开发人员可以调用使用数组作为参数的方法向表格中增加少量二进制数据(小图片、短音频等),对于大量二进制数据(图片、完整的歌曲等),则需要保存数据到文件,然后使用文件URI调用方法。这导致保存数据到文件并在记录的隐藏字段保存文件路径。
(四)批量更新记录
通过ContentResolver.update()方法可批量更新数据,需提供需要修改的列名和值。
(五)删除记录
如果需要删除单条记录,可调用方法并提供特定运行的URI,如果需要删除多条记录,可调用方法并提供删除记录类型的URI,它定义哪些行需要删除。注意:必须提供一个合适的where语句,否则可能删除全部数据。
ContentProviders就像一个暴露的“数据库”,外界可获取其提供的数据,应用间的隐私泄密,应用程序的数据被其他应用访问时,可能带来隐私数据泄露问题。访问Content Provider中的内容是泄密的一种方式。
Android系统的ContentProvider组件使应用间相互访问或操作数据简单化。ContentProvider对应用的SQLite、文件等数据封装后对外提供一个标准接口。其他应用只要使用这个标准接口就可以以表的形式访问或操作ContentProvider封装的SQLite、文件等数据内容,无需关注数据在底层是如何存储的。在Android手机中,许多系统提供的应用使用了ContentProvider存储数据。例如,通讯录应用使用ContentProvider存储联系人信息,短信应用使用ContentProvider存储用户的短信内容等。此外,开发者也可以把应用的数据内容封装到ContentProvider来让其他应用操作。其他应用通过ContentProvider接口访问或操作ContentProvider封装的数据。ContentProvider扩展了系统功能的同时,可能会带来应用间隐私泄露问题。恶意应用可以通过ContentProvider组件访问其他应用的隐私,从而封装在ContentProvider的隐私被恶意应用窃取。
1.获取ContentResolver对象
ContentResolver resolver=Context.getContent-Resolver();注意:在 resolver的 query(Uri uri,String projects,String where,String args,String sort)方法里,有5个参数。第一个参数为Uri类型,Uri的全称是统一资源标示符,用户标识资源的。Uri字符串的格式为”scheme://host:port/path”,scheme为框架,host为主机,port为端口,path为路径。其实 Intent的data属性的内容就必须是Uri类型的,这里也可以用它来查找数据库中的某一个表。
2.定位表
“content://com.android.contacts/contacts”
“content://com.Android.contacts/raw_contacts”,可使用以上uri字符串两者之一,这两个Uri字符串都可以获取联系人的全部id,然后再用联系人的id查询data表,就可以获取联系人对应id的全部资料,如电话,邮箱,姓名等。
为了获取数据库中存放短信的表信息,需要查询Uri为“content://sms/。”
最后获取短信和联系人需要在清单文件中所加入的权限为:
读短信的权限 READ_SMS
读联系人的权限 READ_CONTACTS
本文重点介绍了Android四大组件之一Content-Provider。ContentProvider是所有应用程序之间数据存储和检索的一个桥梁,它实现了各个应用程序之间(跨应用)数据共享,用一套标准的方法来提供数据的增、删、改、查功能,ContentProvider组件使应用间相互访问或操作数据简单化,但是恶意软件可以通过 ContentResolver调用系统提供的 Content-Provider来获取存在sqlite数据库中的用户的联系人与短信。
[1]李淑民.Android智能手机隐私泄露机制及防范方法研究[D].北京交通大学,2015:16-20.
[2]陈小龙.基于Android平台的智能短信管理系统的研究与实现[D].兰州大学,2015:12-13.
[3]倪红军.基于Android系统的数据存储访问机制研究[J].计算机技术与发展,2013,(6).
[4]明日科技.Android从入门到精通[M].北京:清华大学出版社,2015:350-363.
[5]华梦峥.Android安全机制与隐私保护 [D].上海交通大学,2015:23-25.
(责任编辑:魏树峰)
其中,replaceStr函数为自定义函数,replaceStr函数中替换字符串的思路是,如果所查找的文字对象中包含所要替换的字符串,就将所查找的文字对象分割成三部分:所要替换的字符串及其左右两侧的字符串。将所要替换的字符串进行替换的操作,然后将左右两侧的字符串连接到新的字符串两侧,将形成的字符串赋给所查找的文字对象。
(1)运行AutoCAD2004,在图形窗口中添加个文字对象,其中有一个是多行文字对象,文字内容可以自行掌握。
(2)在VBA集成开发环境中,按下F5键运行本节创建的程序,系统在AutoCAD2004主界面中弹出【多重查找和替换】对话框。在【查找】和【替换为】文字框中输入对应的三组文字。
(3)在【多重查找和替换】对话框中,单击【确定】按钮,完成查找和替换的操作。
通过这个程序的设计,实现了在程序启动时清除所有文本框的内容,查找和替换文字的方法,思考AutoCAD一些功能的实现方法,然后对不足的功能进行改进。在实际使用过程中,程序运行稳定,提高了工作效率,效果良好。
参考文献:
[1]吴宏斌,周新邵.基于AutoCAD的图块的查找/替换器的开发[J].中国科技信息,2011,(6):37.
[2]吴海锋.AutoCAD VBA在工程制图中的应用[J].交通科技与经济,2009,(2):45-46.
[3]张 帆,郑立楷,等.AutoCAD VBA开发精彩实例教程[M].清华大学出版社,2004.
[4]刘增达,王洪艳.基于AutoCAD数字地形图批量文字字体替换器设计与实践[J].城市勘测,2008,(4):63.
(责任编辑:魏树峰)
Research on Data Sharing of ContentProvider Based on Android
QU Su
(Yangzhou Business College of Jiangsu Union Technical Institute,Yangzhou 225000,China)
The Android system does not provide publi c storage area for all applications,but it provides a ContentProvider class,which serves to save and retrieve data,and make it visible to all applications.The basic concept and methods of ContentProvider are introduced,and the method of using ContentProvider to acquire Android user information is also addressed.
Android;ContentProvider;ContentResolver;URI;
TP333
A
2016-11-02
瞿 苏(1982-),女,江苏扬州人,讲师,研究方向:计算机应用技术。E-mail:2817249813@qq.com.
1671-802X(2016)06-0011-05