delphi android动态权限,DELPHI安卓动态权限申请

DELPHI安卓动态权限申请

安卓8.0以前的版本,只需要给静态权限就可以了,但安卓8.0及以后的版本,还需要运行期用代码动态申请权限。

下面以《蓝牙权限》为例,其他权限类似。

Delphi 10.3 社区版,提供的 Sample 里面有一个例子程序在:

C:UsersPublicDocumentsEmbarcaderoStudio20.0SamplesObject PascalMulti-Device SamplesDevice Sensors and ServicesBluetoothBLEScanner

这个例子程序提供了打开 BLE 的时候的动态权限验证的例子代码。

首先,在 IDE 的 Project - Options 菜单弹出来的窗口里面,找到左边树结构的: Application -- Uses Permissions 项目,则右边会出来一堆权限让你打勾。这里要勾选上 Bluetooth 和 Bluetooth admin 两项。

老的安卓版本,勾选这两项就可以了。

新的安卓版本,还需要运行期用代码动态申请权限。

代码里面:

首先要实现一个函数:

procedure RequestPermissionsResult(Sender: TObject; const APermissions: TArray; const AGrantResults: TArray);

这个函数是一个动态申请权限的结果的回调函数。

在启动 BLE 的时候,通过以下代码申请权限:

PermissionsService.RequestPermissions([FLocationPermission], RequestPermissionsResult, DisplayRationale);

上述的代码的 PermissionsService 是声明在 System.Permissions 里面的。

上述代码里面的 RequestPermissionsResult 就是前面的那个回调函数。它在这里被调用,而且还被填入参数。

上述代码里面的 FLocationPermission: string; 它来自:

procedure TForm6.FormCreate(Sender: TObject);

begin

{$IFDEF ANDROID}

FLocationPermission := JStringToString(TJManifest_permission.JavaClass.ACCESS_COARSE_LOCATION);

{$ENDIF}

end;

上述代码里面用到的 JStringToString 要 Uses Androidapi.Helpers;

上述代码中还有一个 DisplayRationale 也是一个函数:

procedure TForm6.DisplayRationale(Sender: TObject; const APermissions: TArray; const APostRationaleProc: TProc);

begin

TDialogService.ShowMessage('We need to be given permission to discover BLE devices',

procedure(const AResult: TModalResult)

begin

APostRationaleProc;

end)

end;

在 RequestPermissionsResult 这个函数里面,判断是否通过权限,如果通过,才去调用蓝牙的方法。

procedure TForm6.RequestPermissionsResult(Sender: TObject; const APermissions: TArray; const AGrantResults: TArray);

begin

// 1 permissions involved: ACCESS_COARSE_LOCATION

if (Length(AGrantResults) = 1) and (AGrantResults[0] = TPermissionStatus.Granted) then

StartBLEDiscovery

else

TDialogService.ShowMessage('Cannot start BLE scan as the permission has not been granted');

end;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/419558.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle之创建和管理表

create table emp2 AS Select employee_id,last_name name,hire_date,salary from employees select * from emp2 --创建表 --白手起家 /* create table emp1(id number(10),name varchar(20),salary number(10,2),hire_date date ) */

LocalBroadcastManager 的使用

一、使用本地广播发送一条广播(本例为自己发送自己接收,本地广播也可以是其他应用接收)然后接收到广播时回调Receiver类中的回调方法onReceive()在此方法中自定义发出通知 代码 1 package com.qf.broadcastreceiver06;…

android xml正方形,使用Android Constraintlayout创建一排均匀分布的正方形

我正在努力创建一个由均匀分布的正方形链组成的布局,这些正方形可以填充可用空间。使用Android Constraintlayout创建一排均匀分布的正方形我到底想要的布局,看起来像这样:的想法是,与不同的宽高比手机这个正方形成长一点点地使用…

oracle之单行函数之子查询课后练习2

1. 查询和Zlotkey相同部门的员工姓名和雇用日期 a) select last_name,hire_date b) from employees c) where department_id ( d) select department_id e) from employees f) where last_name Zlotkey g…

JavaWeb 如何防止表单重复提交 - 使用Token,令牌

JavaWeb 如何防止表单重复提交 - 使用Token,令牌 说到重复提交 ,应该想到两种场景:1. 在下单,或者支付 这种情况 那么不允许 刷新,不允许后退再点击提交(后退之后提交会失败,修改了也不行&…

oracle之创建和管理表之练习题

51. 利用子查询创建表 myemp, 该表中包含 employees 表的 employee_id(id), last_name(name), salary(sal), email 字段1). 创建表的同时复制 employees 对应的记录create table myemp asselect employee_id id, last_name name, salary sal, email from employees 2). 创建表…

android icu4c 7.1编译报错,android4.0编译系统时候遇到的错误集

1、Android library XXX.so not in prelink map 错误解决在编译自己的Android library时可能会出现library XXX.so not in prelink map 错误,这是由于Android的预编译设置引起的,/build/core/prelink-linux-arm.map文件描述了预编译的模块需要修改所在文…

oracle之数据处理

--创建表 create table emp3 as select employee_id,last_name,hire_date,salary from employees--查询表 select * from emp3--插入表 insert into emp3 values(1001,AA,sysdate,10000) 运行结果 插入对应三项 --空值用null代替 --复制表 insert into emp3(last_name,employe…

HDU 4635(强连通分量分解

题目:给出一个有向图,要求添加最多的边数,使得图仍然不强连通. 思路:首先这个图在添加边之后肯定变成了两个强连通分量,现在就看怎么分.然后我们可以注意到,原图进行强连通分量分解之后必然存在一些分量的出度或入度为0,最小的分量肯定在这些分量之中.那么找出这个分量就可以得…

Android方法的概括,android中的Filter接口简介

一、结构public abstract class Filter extends Objectjava.lang.Objectandroid.widget.Filter二、概述过滤器通过过滤模式来约束数据,通常由实现了Filterable接口的子类来生成。 过滤操作是通过调用filter(CharSequence)或者filter(CharSequence, android.widget.F…

oracle之数据处理之课后练习

55. 更改 108 员工的信息: 使其工资变为所在部门中的最高工资, job 变为公司中平均工资最低的 job1). 搭建骨架update employees set salary (), job_id () where employee_id 108;2). 所在部门中的最高工资 select max(salary)from employeeswhere department_id (select …

nyoj--79--导弹拦截(动态规划)

拦截导弹 时间限制:3000 ms | 内存限制:65535 KB 难度:3描述 某国为了防御敌国的导弹袭击,发展中一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一…

android webview 长按菜单拦截,javascript-在Android上长按时禁用上下文菜单

javascript-在Android上长按时禁用上下文菜单我想禁用长按(触摸并按住)Web应用程序中的图像后出现的上下文菜单。 我见过关于如何做到这一点的不同想法,但似乎没有一个对我有用。有没有办法通过HTML / CSS / Javascript在Android上执行此操作?12个解决方…

oracle之数据处理之约束1

--创建表 create table emp4( id number(10) constraint emp2_id_nn not null, name varchar2(20) not null, salaty number(10,2) )--查询表 select *from emp4--插入 insert into emp4 values(1001,geyao,2000) 运行结果 --创建表 create table emp5( --列级约束 id numbe…

java中注解的使用与实例(一)

注解目前非常的流行,很多主流框架都支持注解,而且自己编写代码的时候也会尽量的去用注解,一时方便,而是代码更加简洁。 注解的语法比较简单,除了符号的使用之外,它基本与Java固有语法一致。Java SE5内置了三…

android sqlite 操作类封装,[Android] Sqlite 数据库操做 工具封装类

sqlite 数据库封装类htmlDatabaseUtil.java(封装的类)javapackagecom.jack.androidbase.tools;importandroid.content.ContentValues;importandroid.content.Context;importandroid.database.Cursor;importandroid.database.SQLException;importandroid.database.sqlite.SQLite…

oracle之数据处理之约束2

--修改约束 alter table emp5 modify (salary number(10,2) not null)运行结果 --删除约束 alter table emp5 drop constraint emp5_name_nn 运行结果

css实现一个写信的格式

一、目标 目标实现如下效果: 二、完成 1、分析 这个效果看起来很简单,实际上可能并不那么容易实现。 首先是全部东西都居中显示,除了“亲爱的starof”这个称呼的地方。这也是难点,也是本文要重点说的地方。 开始我尝试将“ 亲爱的…

android 6.0版本名字,棉花糖Marshmallow 是Android 6.0的名字

Android 6.0 五月下旬在 I/O 大会上亮相,将于今年秋天与用户见面。但是依照惯例,谷歌并没有宣布新 Android 的代号全称,而 Android M 中 M 所代表的甜品:Marshmallow(棉花糖)。并不是MM巧克力豆,巧克力豆的粉丝&#x…