通常用户用到的ContentProvider并不是自己暴露的数据,更多的是通过ContentResolver来读取其他应用的信息,而最常用的莫过于读取系统App、信息、联系人、多媒体信息等。如果想调用这些数据,ContentProvider就需要自行查阅相关的API资料。另外,不同的版本可能对应着不同的URL。
下面以最常用的读取联系人为例,介绍如何获取URL与对应的数据库表的字段。
(1)到系统源码文件下:all-src.rar→TeleponeProvider→AndroidManifest.xml查找对应的API。
(2)打开模拟器的file exploer/data/data/com.android.providers.contacts/databases/contact2.db,导出后使用SQLite图形工具查看raw_contact表、data表、mimetypes表这三个核心表。
下面演示一些基本的操作示例。
案例:读取媒体数据库里的音乐文件信息。
(1)新建一个module,命名为Content ProviderDemo。
(2)API 19以前的模拟器(API 17、API 18测试通过)可以通过DDMS导入音乐文件到模拟器,见图4.10。
图4.10
再通过模拟器自带的媒体扫描器把媒体文件扫描入库,见图4.11。
图4.11
完成后可以使用模拟器自带的music播放器检查一下,见图4.12。
图4.12
可以看到mp3已经识别,但wma文件未能识别。
(3)API 19之后的模拟器比较麻烦,使用DDMS导入文件后,模拟器无法触发扫描,可使用模拟器自带的浏览器访问QQ邮箱,从邮件附件里下载媒体文件(API 19、API 21、API 22测试通过),见图4.13。
图4.13
使用music测试效果,见图4.14。
图4.14
可以看到仍然只有mp3被识别。
(4)布局文件activity_main.xml。
(5)AndroidManifest.xml。
(6)MainActivity.java。(www.xing528.com)
(7)运行效果,见图4.15。
图4.15
(8)Android 6.0(API 23)之后谷歌发布了App Permissions(软件权限管理)。在Android 6.0中,Android系统加入了软件管理权限。用户用起来是放心了很多,但对于开发者,需要在编程的过程中多做一些工作。在Android中,如果在App中的AndroidManifest.xml中没有声明软件的权限,App就没权限去做相应的事,这是众所周知的。但是在Android 6.0后,有些权限即使用户在AndroidManifest.xml文件中添加了声明,也还是会报java.lang.SecurityException异常。因为这个时候用户可能已申请了Dangerous Permissions(危险权限)。危险权限包括应用需要涉及用户隐私信息的数据或资源,或者可能对用户存储的数据或其他应用的操作产生影响的区域。例如,读取用户联系人的权限就属于危险权限。对于危险权限首先要在AndroidManifest.xml中先声明,还需要在App运行时进一步授权,以外部存储为例,需要在MainActivity.java中增加如下方法:
(9)实际代码MainActivity.java。
(10)API 23以后在使用类似模拟器自带的浏览器下载文件时,还需要打开APP的存储权限,否则也会报错。
(11)运行效果,见图4.16。
图4.16
第一遍运行时弹出上图界面,只需单击ALLOW即可。
接着需要设置浏览器的存储权限,见图4.17。
图4.17
接着参照API 22的方法下载音乐文件到模拟器,最终运行效果,见图4.18。
图4.18
API 23测试成功。
(12)API 24以后需要使用DDMS把音频文件导入,先到platform-tools文件夹下执行cmd,执行abd root获得root权限,再进入DDMS导入文件到如图4.19所示位置(API 24,API 25测试通过),不要直接导入Music文件夹,否则模拟器无法扫描到该文件。
图4.19
使用模拟器的Download对导入文件进行复制或移动操作,见图4.20。
图4.20
Download文件夹下出现文件模拟器会自动完成媒体文件的扫描。
(13)API 26以后使用DDMS把音频文件导入到如图4.21所示位置(API 26,API 27,API 28测试成功),不要直接导入Music文件夹,否则模拟器无法扫描到该文件。
图4.21
运行模拟器上的File管理器,从Download移动到Music文件夹(其他文件夹也可以)使得模拟器能够扫描到音频文件。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。