笔者近这天在研究蓝牙开发,无奈总是搜索不到周围的蓝牙设备,笔者觉得自己的逻辑应该没有错误的,因为笔者直接看的是google的官方文档,按着示例代码敲下来的,而且android studio也没有报任何的error,在不经意间,笔者把该程序的应用程序的权限中的地理位置打开,却发现可以搜索到周围的设备了…于是笔者就有了下面这么一篇分享(基于Android API 23以上):
为什么有的android程序的权限在开发的时候,不用在权限管理里面打开也可以正常使用呢?
这是因为google把permission权限分为好几个Protection leve,可以在google的官方文档的权限列表里面看到,其中,危险级别的是需要用户经过选择允许才可以开启的,也就是说,需要开发者在程序代码中逻辑实现给用户选择,不然,用户不知道是否需要开启所需要的权限;
如何逻辑实现提示用户开启程序所需要的权限呢?
//检查系统是否开启了地理位置权限;
//注意:此时的Manifest的导入包路径import android.Manifest;
if (ContextCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 1);
}
- 执行完requestPermissions方法后,Activity会自动回调一个onRequestPermissionsResult方法:
//requestPermissions方法执行后的回调方法
/*
* requestCode:相当于一个标志,
* permissions:需要传进的permission,不能为空
* grantResults:用户进行操作之后,或同意或拒绝回调的传进的两个参数;
* */
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
//这里实现用户操作,或同意或拒绝的逻辑
/*grantResults会传进android.content.pm.PackageManager.PERMISSION_GRANTED 或 android.content.pm.PackageManager.PERMISSION_DENIED两个常,前者代表用户同意程序获取系统权限,后者代表用户拒绝程序获取系统权限*/
}
- 实现上面的逻辑,系统会自动弹出一个dialog的对话框,与用户进行交互,去提示用户是否允许权限;
附录
以下是危险级别的权限:
- ACCESS_COARSE_LOCATION:允许APP访问大概地理位置。
- ACCESS_FINE_LOCATION:允许APP访问精确地理位置。
- ADD_VOICEMAIL:允许APP添加语音信箱在程序里面。
- BODY_SENSORS:允许应用程序访问用户用来衡量身体内发生的情况的传感器的数据,例如心率。
- CALL_PHONE:允许应用程序发起电话而不通过拨号器用户界面供用户确认通话。
- CAMERA:请求能够访问摄像头设备。
- GET_ACCOUNTS:允许访问帐户服务中的帐户列表。
- PROCESS_OUTGOING_CALLS:允许应用程序在呼出期间查看正在拨打的电话号码,并选择将呼叫重定向到其他号码或完全中止呼叫。
- READ_CALENDAR:允许应用程序读取用户的日历数据。
- READ_CALL_LOG:允许程序读取用户的呼叫日志。
- READ_CONTACTS:允许程序能够读取用户的联系人的数据。
- READ_EXTERNAL_STORAGE:允许程序读取扩展存储。
- READ_LOGS:允许程序读取受保护的日志文件。
- READ_PHONE_STATE:允许只读访问电话状态,包括设备的电话号码,当前的蜂窝网络信息,任何正在进行的呼叫的状态以及在设备上注册的任何PhoneAccounts的列表。
- READ_SMS:允许程序读取手机短信。
- RECEIVE_MMS:允许程序去监听手机接收到的MMS信息
- RECEIVE_SMS:允许程序去接收信息。
- RECEIVE_WAP_PUSH:允许应用程序接收WAP推送消息。
- RECORD_AUDIO:允许应用程序录制音频。
- SEND_SMS:允许应用程序发送短信。
- USE_SIP:允许应用程序使用SIP服务。
- WRITE_CALENDAR:允许应用程序写入用户的日历数据。
- WRITE_CALL_LOG:允许应用程序写入(但不读取)用户的通话记录数据。
- WRITE_CONTACTS:允许应用程序写入用户的联系人数据。
- WRITE_EXTERNAL_STORAGE:允许程序去写入扩展的存储。