在看这篇文章之前,建议先了解什么是动态申请权限,参见作者《【Delphi】Android 程序权限详细说明》。明白了动态申请权限后,就需要开发动态申请权限程序,为了方便,我们把动态申请权限的程序封装成一个控件,只需要两条语句即可实现动态申请权限。
一、需要动态申请的权限(dangerous)列表:官方文档
序号 | 权限 | 说明 | API |
1 | ACCESS_COARSE_LOCATION | 应用程序访问大致位置 | 1 |
2 | ACCESS_FINE_LOCATION | 应用程序访问精确位置 | 1 |
3 | ACCESS_BACKGROUND_LOCATION(*) | 允许程序后台获取位置信息,如果要这个权限,必须首先请求好ACCESS_COARSE_LOCATION或者ACCESS_FINE_LOCATION权限 | 29 |
4 | ACCESS_MEDIA_LOCATION | 允许应用从媒体收藏中读取未知信息 | 29 |
5 | ACCESS_MOCK_LOCATION(obsolete) | 似乎是关于GPS位置信息的权限,当前官方文档已经查询不到,弃用 | |
6 | ACTIVITY_RECOGNITION | 获取设备中的健身运动信息 | 29 |
7 | ADD_VOICEMAIL | Allows an application to add voicemails into the system | 14 |
8 | ANSWER_PHONE_CALLS | 接听或挂断电话、监听通话状态 | 26 |
9 | AUTHENTICATE_ACCOUNTS(obsolete) | 目前官方已弃用 | |
10 | BODY_SENSORS | 获取您的生命体征相关数据 | 20 |
11 | BODY_SENSORS_BACKGROUND | 后台获取您的生命体征相关数据 | 33 |
12 | CALL_PHONE | 直接拨打电话 | 1 |
13 | CAMERA | 拍摄照片和录制视频 | 1 |
14 | CONYINUE_A_CALL_STARTED_IN_ANOTHER_APP | 目前官方已弃用 | |
15 | GET_ACCOUNTS | 获取手机账户 | 1 |
16 | MANAGE_ACCOUNTS(obsolete) | 目前官方已弃用 | |
17 | PROCESS_OUTGOING_CALLS | 目前用法从API29开始有改变:接听或挂断电话、监听通话状态 | 1、29 |
18 | READ_CALENDAR | 读取日历中的日程信息 | 1 |
19 | READ_CALL_LOG | 读取通话记录 | 16 |
20 | READ_CONTACTS | 读取联系人信息 | 1 |
21 | READ_EXTERNAL_STORAGE | 读取设备上的照片及文件 | 16 |
22 | READ_HISTORY_BOOKMARKS(obsolete) | 目前官方已弃用 | |
23 | READ_PHONE_NUMBERS | 获取当前手机号码 | 26 |
24 | READ_PHONE_STATE | 获取手机状态,比如当前可否拨打电话 | 1 |
25 | READ_SMS | 读取短信权限 | 1 |
26 | RECEIVE_MMS | 允许程序接收MMS消息 | 1 |
27 | RECEIVE_SMS | 允许程序接收短信 | 1 |
28 | RECEIVE_WAP_PUSH | 允许程序接收WAP推送消息 | 1 |
29 | RECORD_AUDIO | 进行通话录音或者本地录音 | 1 |
30 | SEND_SMS | 发送短信权限 | 1 |
31 | USE_SIP | 使用SIP视频服务 | 9 |
32 | WRITE_CALENDAR | 读写入日历中日程信息 | 1 |
33 | WRITE_CALL_LOG | 修改通话记录 | 16 |
34 | WRITE_CONTACTS | 修改联系人信息 | 1 |
35 | WRITE_EXTERNAL_STORAGE | 读写设备上的照片及文件 | 4 |
二、控件使用限制:
控件只能支持Delphi 10.3及以上版本,因为10.3以下版本Delphi不支持动态申请权限。如果你使用的是10.3及以上版本,请下载本控件安装使用。另外如果要开发android 8 及以上的APP,建议至少升级到Delphi的10.3版本。
三、控件介绍
1. 控件属性:
序号 | 属性 | 说明 |
1 | Permissions | 是一个包含所有dangerous权限的枚举列表 TPermission = ( ... ) 需要什么权限就选择什么权限。 |
2 | OnApplyResult | 这是一个事件,申请完权限后系统批复结果通知回调事件。 procedure(const Sender : TObject; GrantedResult : Boolean; NoGranteds : TArray<string>) 权限获得成功:GrantedResult = True,NoGranteds 无意义 权限获得失败:GrantedResult = False,NoGranteds 表示失败的权限名称字符串列表 |
2. 控件方法:
序号 | 方法 | 说明 |
1 | Apply | 申请权限,设置需要的权限属性Permissions值之后,就可以通过这个方法申请权限 |
2 | IsPermissionGranted | 判断程序当前是否已经获得某个权限。 function IsPermissionGranted(APermission : string): Boolean; APermission 表示权限名称。 如果权限存在,结果为True,否则为False |
3. 使用方法及源文件下载,请移步Gitee。
var
Android_Permission : TAndroid_Permission;
try
Android_Permission := TAndroid_Permission.Create(nil);
Android_Permission.Permissions := Android_Permission.Permissions + [CAMERA];
//....
Android_Permission.Apply;
finally
Android_Permission.Free;
end;