android 蓝牙权限问题

本文解决了一个关于蓝牙打印机应用程序遇到的SecurityException问题。原因是未在Android应用的清单文件中正确声明蓝牙权限。文中给出了具体的解决方案,即添加了BLUETOOTH和BLUETOOTH_ADMIN两个权限。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Caused by: java.lang.SecurityException: Permission Denial: starting Intent { act=android.bluetooth.adapter.action.REQUEST_DISCOVERABLE flg=0x10000000 cmp=com.android.settings/.bluetooth.RequestPermissionActivity } from ProcessRecord{42d0abe8 10801:com.flyang.developer/u0a115} (pid=10801, uid=10115) requires android.permission.BLUETOOTH

 

在做蓝牙打印机时报此错误,是因为忘记在清单文件中加入蓝牙的权限

添加这两句话

<uses-permission android:name="android.permission.BLUETOOTH"/>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

### Android 平台下的蓝牙权限申请与配置 #### 动态权限请求的重要性 对于Android 6.0及以上版本,在尝试访问蓝牙功能之前,应用程序必须先向用户请求必要的运行时权限。这不仅适用于蓝牙操作,还包括其他敏感APIs的调用[^2]。 #### 定义所需的权限 为了使应用能够正常工作并利用蓝牙特性,需在`AndroidManifest.xml`文件中声明特定的权限: ```xml <uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> <!-- For API level >= 23 (Marshmallow), also add --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> ``` 这些权限允许程序执行基本的蓝牙任务以及更精细的位置服务控制,后者尤其重要因为自Android 6.0起,精确位置信息成为成功扫描附近蓝牙LE设备的前提条件之一[^3]。 #### 请求运行时权限 当目标SDK版本设置为23或更高时,除了静态声明外,还需要通过代码主动询问用户的同意来授予上述某些权限。下面是一个简单的例子展示如何实现这一点: ```java if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION); } ``` 这段Java代码片段展示了如果缺少细粒度定位权限,则会触发一次弹窗提示给最终用户以获得该权限授权。 #### 处理权限响应 一旦发出权限请求对话框后,无论结果为何都需要妥善处理返回的结果以便继续后续逻辑流程。通常情况下这是在一个回调函数内完成的: ```java @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults){ super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode){ case MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION:{ if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ // Permission was granted. }else{ // Permission denied. } return; } } } ``` 此部分确保即使用户拒绝了所求权限也能优雅降级而不至于崩溃退出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值