在项目选项窗口中,我们将转到Application-> Uses Permissions部分。在目标部分,我们必须根据要编译的版本选择32或64位Android平台。
向Delphi请求Android权限
在这种情况下,我们将执行请求本地化权限的示例。首先,我们将转到菜单Project-> Options,然后在项目选项窗口中打开Application-> Uses Permissions部分。
在“普通”权限内,我们选择“ Internet”,在“危险”权限中,我们选择“访问粗略位置”和“访问精细位置”权限。
我们应该只向用户请求最后两个权限的授权,因为这很危险。
Delphi中处理权限的单位是System.Permissions,因此我们必须将其添加到Uses中。
其次,为我们要请求的每个危险权限声明一个全局变量。代码如下:
uses
System.SysUtils, System.Types, System.UITypes,
System.Classes, System.Variants, FMX.Types,
FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
System.Permissions;
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
// Variables Dangerous Permissions
vPermissionCoarseLocation: string;
vPermissionFineLocation: string;
implementation
{$R *.fmx}
end.
在Form的OnCreate事件中,我们放置以下代码,将每个权限的值分配给先前声明的变量,但并非没有在Uses中首先添加Androidapi.Helpers和Androidapi.JNI.Os单元:
Uses
Androidapi.Helpers, Androidapi.JNI.Os
...
procedure TFLogin.FormCreate(Sender: TObject);
begin
vPermissionCoarseLocation := JStringToString(TJManifest_permission.JavaClass.ACCESS_COARSE_LOCATION);
vPermissionFineLocation := JStringToString(TJManifest_permission.JavaClass.ACCESS_FINE_LOCATION);
end;
需要说明的是,直到Andorid版本6为止,权限是在安装App时显示的。
从API的第23级开始,可以在执行期间的任何时间请求对用户的危险权限的授权。
在此示例中,我们将其放置在表单的OnShow事件中,但请记住,可以随时在始终使用权限授权的内容之前对其进行请求。
请求授权的过程是PermissionsService.RequestPermissions([
],)。
procedure TForm1.FormShow(Sender: TObject);
begin
if TOSVersion.Check(6) then
begin
PermissionsService.RequestPermissions([vPermissionCoarseLocation, vPermissionFineLocation], LocationPermissionRequestResult);
end
end;
procedure TForm1.LocationPermissionRequestResult(Sender: TObject;
const APermissions: TArray;
const AGrantResults: TArray);
var
LocationPermissionGranted: Boolean;
begin
LocationPermissionGranted := (Length(AGrantResults) = 2) and
(AGrantResults[0] = TPermissionStatus.Granted) and
(AGrantResults[1] = TPermissionStatus.Granted);
if LocationPermissionGranted then
begin
ShowMessage('所有许可证都被接受.'); // delphitop.com 提示机器翻译将就将就
end
else
begin
ShowMessage('许可证还没有签发。.');
end;
end;
我们在OnShow事件中所做的工作是检查Android版本是否等于或大于6,如果为true,则我们请求权限授权,并通过参数传递带有请求权限和权限登陆过程的数组。
在作为授权权限的登录过程传递的LocationPermissionRequestResult过程中,我们可以检查用户是否授权了所请求的权限并采取了相应的措施。
例如,如果我们要在地图上显示用户的位置,并且用户未授权地理位置,那么我们将不显示地图,并且将警告用户拒绝许可。
Delphi中的Andrid中的权限示例
向用户请求地理位置许可的单位的完整代码如下:
unit Unit1;
interface
uses
System.SysUtils, System.Types, System.UITypes,
System.Classes, System.Variants, FMX.Types,
FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
System.Permissions, Androidapi.Helpers, Androidapi.JNI.Os;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure LocationPermissionRequestResult(Sender: TObject;
const APermissions: TArray;
const AGrantResults: TArray);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
// Permissions
vPermissionCoarseLocation: string;
vPermissionFineLocation: string;
implementation
{$R *.fmx}
procedure TForm1.FormCreate(Sender: TObject);
begin
vPermissionCoarseLocation := JStringToString(TJManifest_permission.JavaClass.ACCESS_COARSE_LOCATION);
vPermissionFineLocation := JStringToString(TJManifest_permission.JavaClass.ACCESS_FINE_LOCATION);
end;
procedure TForm1.FormShow(Sender: TObject);
begin
if TOSVersion.Check(6) then
begin
PermissionsService.RequestPermissions([vPermissionCoarseLocation, vPermissionFineLocation], LocationPermissionRequestResult);
end
end;
procedure TForm1.LocationPermissionRequestResult(Sender: TObject;
const APermissions: TArray;
const AGrantResults: TArray);
var
LocationPermissionGranted: Boolean;
begin
LocationPermissionGranted := (Length(AGrantResults) = 2) and
(AGrantResults[0] = TPermissionStatus.Granted) and
(AGrantResults[1] = TPermissionStatus.Granted);
if LocationPermissionGranted then
begin
ShowMessage('所有许可证都被接受。');
end
else
begin
ShowMessage('许可证还没有签发.');
end;
end;
end.
如果您仍有任何疑问或疑问,请给我评论。