自从Android 5.1 开始(实际感觉是从 android 8开始的),为了安全有些权限需要动态申请。这些权限还比较多,日后随着Android版本的提升,还有可能添加、变化权限。同时delphi的版本也比较多,不同的版本支持的权限也有些区别,本文就不同Delphi版本和不同android版本相关权限做个自我理解的说明。同时介绍新版本delphi开发Android需要的三种权限处理方法。
一、Delphi 不同版本支持的Android版本情况表:
序号 | Delphi 版本 | 支持Android版本 | 支持ios版本 |
1 | D11.1(Alexandria) | Android 12,11,10,Pie(9.0),Oreo(8.1) | ios 15 |
2 | D11 (Alexandria) | Android 11 | |
3 | D10.4(Sydney) | Android 10 | ios 14 |
4 | D10.3.3 (Android 64-bit support) | Android 10 | ios 13 |
5 | D10.3.1 | Android 9 | ios 12 |
6 | D10.3(RIO) | Android 8.1,8(API Level 26) | ios 12 |
7 | D10.2.3(2018-03-13) | Android 8 | ios 11.3 |
8 | D10.2.2 | Android 8 | ios 11 |
9 | D10.2.1 | Android 7 | ios 10.3 |
10 | D10.2(Tokyo) | Android 7 | ios 10 |
11 | D10.1(Berlin) | Android 6(API 23) | ios 10 |
12 | D10.0(Seattle) | Android 5.0, 5.1 (API Level 21, 22) Android 4.4(API Level 19) Android 4.0.3 and 4.0.4(API Level 15) | ios 9 |
13 |
二、从 D10.3 开始支持新的 Android 授权模式(New Android Permission Model)
在10.3以前,Android的授权模式就是一种,在编译的时候就确定好了,无需用户在程序运行时动态授权。从10.3以后,授权模式就区分为以下三种
序号 | 授权类型 |
1 | Normal Uses Permissions(无需动态确认) |
2 | Dangerous Uses Permissions(需要动态确认:需要用户程序运行时确认) |
3 | Signature Uses Permissions(无需动态确认) |
无需动态确认的权限(install权限),只需要在 Project > Options > Application > Uses Permissions 菜单中勾选对应的权限即可完成授权。
需要动态确认的权限(runtime权限),除了上一步勾选之外,还需要在程序运行的时候提示用户确认,这一步需要通过程序来完成。如果这两步有一步没有成功,则无法获取到对应的权限。
上图是 10.1 的授权截图。只要开发时在配置中授权即可。
这张图为 11.1 的授权截图。需要在程序运行时,让用户授权确认。
三、Permisssion 权限级别说明
级别 | 解释 |
normal | normal级别是默认值。低风险的权限采用此级别。在app安装的时候,系统自动赋予此app请求的所有normal权限,而不会征求用户的同意(但是,在安装app之前,用户总是有权选择检查这些权限)。 |
dangerous | 较高风险的权限,此级别的权限意味着,请求权限的app将要访问用户的隐私数据或者控制设备,这可能给用户带来负面影响。 因为dangerous权限会引入潜在的风险,所以系统不会自动赋予此类权限给app。例如,在安装app的时候,会将dangerous权限展示给用户,并请求用户确认。 |
signature | 只有请求权限的app与声明权限的app的签名是一样的时候,系统才会赋予signature权限。 如果签名一致,系统会自动赋予权限,而不会通知用户或者征求用户的同意。 |
关于install权限和runtime权限:
install权限(无需动态):安装时权限,是指在安装app的时候,赋予app的权限。normal和signature级别的权限都是安装时权限。不会给用户提示界面,系统自动决定权限的赋予或拒绝。
runtime权限(需要动态):运行时权限,是指在app运行过程中,赋予app的权限。这个过程中,会显示明显的权限授予界面,让用户决定是否授予权限。如果app的targetSdkVersion是22(Lollipop MR1 5.1)及以下,dangerous权限是安装时权限,否则dangerous权限是运行时权限。
总结:
1. 如果你使用Delphi10.3以下版本,就无需考虑动态授权(runtime权限);
2. 如果使用Delphi10.3及以上版本,就需要支持动态授权(runtime权限),这样程序才能正确获取到对应的权限;
3. 如果需要动态授权,除了需要在程序配置页面进行勾选外,还需要程序专门提示用户授权确认,否则程序无法得到授权,对应的功能将不起任何作用,也不会有任何提示,这种情况下你将会是一头雾水(重点 重点 重点) 程序该如何实现呢?参见下一篇《【Delphi】开发Android程序动态申请权限控件》
补充说明:
按照Delphi官方的说法,一些基本的权限(不区分install或者runtime)在创建Delphi工程的时候已经默认勾选了,这些权限包括:
Access coarse location
Access fine location
Call phone
Camera
Internet
Read calendar
Read external storage
Read phone state
Write calendar
Write external storage
但在实际测试中发现,高版本的并没有勾选Read calendar和Write calendar权限。切记:勾选了也需要动态授权。