android蓝牙动态权限,安卓蓝牙动态权限-程序员宅基地

技术标签: android蓝牙动态权限  

安卓蓝牙动态权限

安卓7.0及以下版本

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

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

安卓8.0及以上版本,还需要运行期用代码动态申请权限。

代码里面:

首先要实现一个函数:

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;

到这里,APP 使用手机的 BLE 的权限问题才搞定。

奇怪的是,因为这里是使用的“定位”权限,APP 运行时,会弹出窗口询问用户,APP要使用定位权限,是否允许。用户允许后,的确可以使用 BLE 了。同样的测试手机,如果我不去做动态权限申请,直接调用 BLE 的相关功能,没有任何提示,但 BLE 的相关功能的确出不来。

难道没有单独的【蓝牙】权限?给用户一个定位权限的提示,用于打开蓝牙,有点奇怪。

标签:RequestPermissionsResult,const,安卓,蓝牙,BLE,权限,procedure

来源: https://www.cnblogs.com/hnxxcxg/p/12114403.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_29014237/article/details/117349120

智能推荐

linux下make menuconfig在什么目录,Linux kernel的 Makefile和Kconfig以及Make menuconfig的关系...-程序员宅基地

文章浏览阅读407次。熟悉内核的Makefile对开发设备驱动、理解内核代码结构都是非常重要的linux2.6内核Makefile的许多特性和2.4内核差别很大,在内核目录的documention/kbuild/makefiles.txt中有详细的说明。===1、内核Makefile概述Linux内核的Makefile分为5个部分: Makefile最顶层Makefile.config内核当前配置文件,编译时成为顶层M..._make menucofnig 要多久能安装完

CSS 游戏动画案例_css 动画 游戏-程序员宅基地

文章浏览阅读318次。CSS 游戏动画图下载地址:http://www.aigei.com/s?q=%E4%BD%90&type=2d效果点击放技能<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title></title> <style type="text/css"> #d2{ width: 300px; height:_css 动画 游戏

uos 序列号_统信UOS桌面操作系统 v20.1021 专业版镜像-程序员宅基地

文章浏览阅读9k次。uos来头不小,统一多方平台,整合各种资源做出来的国产系统,实际上是基于国产深度系统deepin二改的,实际上deepin也非常不错,经过这么一搞,用户量会更上一个台阶。和深度对大的区别就是,UOS系统的兼容性更好。官方介绍到,在近半年的时间里,UOS 开发团队与龙芯中科的系统软件研发团队强强联合、紧密合作,采用联合技术攻关模式,针对 Linux 内核、BIOS 固件、编译器、浏览器、图形驱动等多..._统信激活序列号

定积分分部积分典型例题_定积分证明题方法总结六篇-程序员宅基地

文章浏览阅读6.1k次,点赞2次,收藏19次。定积分证明题方法总结六篇定积分是历年数学的考查重点,其中定积分的证明是考查难点,同学们经常会感觉无从下手,小编特意为大家总结了定积分的计算方法,希望对同学们有帮助。篇一:定积分计算方法总结一、 不定积分计算方法1. 凑微分法2. 裂项法3. 变量代换法1) 三角代换2) 根幂代换3) 倒代换4. 配方后积分5. 有理化6. 和差化积法7. 分部积分法(反、对、幂、指、三)8. 降幂法二、 定积分的..._抽象函数分部积分练习

Spring cloud服务搭建_springcloud的搭建-程序员宅基地

文章浏览阅读604次。Spring cloud服务搭建一.如何使用Eureka注册服务1.搭建Maven父工程(1)在eclipse中新建一个maven project(2)勾选下图的框,点击下一步(3)填写父工程名称microservice-springcloud,注意packing一定要选择pom(3)完成后,在工程的pom.xml中添加Spring Cloud的版本依赖信息一定要添加以下配置,否则会报错2.搭建服务端工程(1)在父工程microservice-springcloud中,创建Mav_springcloud的搭建

2023常见Vue面试题(含答案)-程序员宅基地

文章浏览阅读4.3k次,点赞4次,收藏43次。vue是一个js的渐进式框架,简单,易用,灵活。_vue面试题

随便推点

kettle入门_kettle怎么连线-程序员宅基地

文章浏览阅读3.9k次,点赞8次,收藏19次。kettle入门_kettle怎么连线

使用flask从零构建自动化运维平台系列二_flask自动化运维管理平台-程序员宅基地

文章浏览阅读2.9w次。文章目录代码管理目录结构目录结构用途说明目录文件说明配置文件使用工厂来创建app使用manage来管理使用manage创建数据库初始化创建历史版本创建数据库jsonrpc模块化数据模型拆分写代码也是一种艺术,结构层次感一定要好,这样做出来的才是一个好作品。代码管理git目录结构SmartOps├── app│&nbsp;&nbsp; ├── factory.py│&nbsp;&nb..._flask自动化运维管理平台

SpringBoot集成RocketMQ使用延时消息与消息过滤_springboot rocketmq 延时队列-程序员宅基地

文章浏览阅读1.1k次。延时消息用来指定消息发送到消息队列(RocketMQ)的服务端后,延时一段时间之后才被投递到客户端进行消费(例如半分钟之后),适用于解决一些消息的生产和消费有窗口弹出要求的场景。例如:电商交易中超过时间未支付则关闭订单,在订单创建时,发送一条延时消息,这条消息将在30分钟以后投递给消费者,消费者受到此消息之后,判断对应的订单是否已支付,如果支付未完成则关闭订单,删除数据,恢复库存,如果已完成支付则忽略。_springboot rocketmq 延时队列

大数据毕业设计吊打导师Python+Spark知识图谱酒店推荐系统 酒店价格预测系统 酒店可视化 酒店爬虫 酒店大数据 neo4j知识图谱 深度学习 机器学习 人工智能 大数据毕业设计 计算机毕业设计-程序员宅基地

文章浏览阅读526次。大数据毕业设计吊打导师Python+Spark知识图谱酒店推荐系统 酒店价格预测系统 酒店可视化 酒店爬虫 酒店大数据 neo4j知识图谱 深度学习 机器学习 人工智能 大数据毕业设计 计算机毕业设计

read函数和write函数_write和read是字节流还是-程序员宅基地

文章浏览阅读2.3k次。用read函数从打开的文件中读取数据。#incldue ssize_t read(int fd, void *buf, size_t nbyte);返回值:读到的字节数,若已到文件尾,返回0;若出错,返回-1如果read成功,则返回读到的字节数,如已到达文件的尾端,则返回0.有多种情况可使实际读到的字节数少于要求的字节数:读普通文件时,在读到要求字节数之前到达了文件尾端。例如_write和read是字节流还是

MySQL数据类型-程序员宅基地

文章浏览阅读667次。前言:这一篇介绍MySQL的数据类型,学过语言的数据类型后,再学这个就比较简单了,这里会详细的举例子说明该数据类型的限制条件和作用方式。_mysql数据类型