频道分类

Delphi Android权限

作者:admin 来源: 日期:2020/11/12 10:00:57 人气: 标签:

 
其中一个要考虑的问题,如果我们希望我们的应用程序来工作,是对Android权限(Android权限)。

如果设备安装了Android 6棉花糖(API级别23),或者TargetSdkVersion App属性为23或更高,则用户必须接受危险的权限。

因此,我们不仅必须将许可放置在应用程序清单中,而且还必须执行请求用户所说许可的功能,以便他们可以接受或拒绝它们。

有哪些危险的权限
许可证分为两类,普通或普通许可证和危险许可证。

关于普通权限,例如使用Internet,仅需要在清单中声明它们,而对于危险权限,我们需要用户的授权。

为了在Delphi中授予权限,我们必须进入菜单Project-> Options。

在项目选项窗口中,我们将转到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([<array_of_permissions>],<landing_procedure>)。

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<string>;
  const AGrantResults: TArray<TPermissionStatus>);
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<string>;
      const AGrantResults: TArray<TPermissionStatus>);
  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<string>;
  const AGrantResults: TArray<TPermissionStatus>);
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.
如果您仍有任何疑问或疑问,请给我评论。

上一篇:Delphi Android 关闭应用程序对话框询问下一篇:没有资料