内容提供器探究
内容提供器简介
内容提供器主要用于在不同的应用程序之间实现数据共享的功能,并且保证被访问数据的安全性。
运行时权限
Android6.0系统中引入了运行时权限。
Android权限机制详解
运行时权限即可以在软件的使用过程中再对某一项权限申请授权。
Android的权限归为两类:
普通权限:不会直接威胁到用户的安全和隐私的权限。对于这部分权限申请,系统会自动帮我们进行授权。
危险权限:可能会触及用户隐私,或对设备安全性造成影响的权限。必须由用户手动点击授权才可以。
当用户同意授权某一危险权限时,则其权限组中其他权限也会同时被授权。
危险权限表:
可以访问http://developer.android.com/reference/android/Manifest.premission.html查看Android系统中的完整权限列表。
在程序运行时申请权限
新建一个RuntimePermissionTest项目。
添加按钮,并修改代码:
1 |
|
并添加权限:
1 | <uses-permission android:name="android.permission.CALL_PHONE" /> |
编译运行后,在Android4.4版本中点击按钮后可以发现自动打开了拨号界面。但是
在Android6.0版本中,点击按钮没有任何反应,查看logcat中断日志,可以看到:java.lang.SecurityException: Permission Denial: starting Intent
的字样。
这是因为6.0以上的系统在使用危险权限时都必须进行运行时权限处理。
修改代码如下:
1 | public class MainActivity extends AppCompatActivity { |
编译运行后点击按钮,在6.0版本以上就会弹出授权窗口(第一授权后,继续点击则默认已授权,需卸载后才会恢复权限设置,或者在权限设置关闭权限),同意后就会自动跳转到拨号界面了。其中ActivityCompat.requestPermissions()的第三个参数为请求码,用于下面重写函数onRequestPermissionsResult()的switch。
访问其他程序中的数据
内容提供器的用法一般有两种,一种是使用现有的内容提供器来读取和操作相应程序中的数据;另一种是创建自己的内容提供器给我们程序的数据提供外部访问接口。
如果一个应用程序通过内容提供器对其数据提供了外部访问接口,那么任何其他的应用程序就都可以对这部分数据进行访问。
ContentResolver的基本用法
ContentResolver提供了一系列方法用于对数据进行CRUD操作,可以用Context中的getContentResolver()方法获取该类的实例
ContentResolver中的增删改查方法都是不接收表名参数的,而是用一个Uri参数代替,这个参数被称为内容URI。
内容URI给内容提供器中的数据建立了唯一标识符,它主要由两部分组成:authority和path。authority用于对不同的应用程序做区分,path则是用于对同一应用程序中不同的表做区分,通常会添加到authority后面。内容URI最标注的格式写法如下:
1 | content://com.example.app.provide/table1 |
读取系统联系人
新建一个ContactsTest项目,修改布局文件为如下:
1 |
|
然后修改代码如下:
1 | public class MainActivity extends AppCompatActivity { |
并且添加权限声明:
1 | <uses-permission android:name="android.permission.READ_CONTACTS" /> |
然后编译运行并授权就可以了。
创建自己的内容提供器
创建内容提供器的步骤
打开DataTest项目,去掉MyDatabaseHelper中的Toast提示,因为跨程序访问时我们不能直接使用Toast。
新建Content Provider,命名为DatabaseProvider,authority指定为com.example.databasetest.provider,修改代码如下:
1 | public class DatabaseProvider extends ContentProvider { |
现在DatabaseTest这个项目就已经拥有了跨程序共享数据的功能了。
接着新建一个ProviderTest项目来访问数据:
修改布局:
1 |
|
然后修改代码:
1 | public class MainActivity extends AppCompatActivity { |
这样即可完成跨程序的内容提供器的创建与操作了。
总结
Android权限分为2类:普通权限和危险权限。在Android6.0版及以上本引入了运行时权限,用户需要手动授予危险权限才能使用,并且一旦授权其对应权限组下其他权限也会被授权。
内容提供器提供了跨程序数据共享的功能,与数据库存储方式类似,可以使用增删改查四个功能,但其参数略有不同。
前文实践中在创建的内容提供器内部引入SQLite数据库的操作,并重写增删改查功能,以实现对外部程序共享数据的功能。