android 6.0 蓝牙权限权限申请的弹窗怎么处理

Android-快速完成6.0运行时动态权限申请 - 简书
Android-快速完成6.0运行时动态权限申请
之前小伙伴让我测试Demo,发现在我手机上权限被拒绝了,这让我好奇了一下,一直以来在app安装的时候声明了所有权限,一般来说同意安装即视为同意所有权限。
因为Android 6.0收紧了权限的控制,如果应用的targetSdkVersion&=23,那不仅仅要在清单文件中声明需要用到的权限,还需要在用户使用时让用户能同意部分权限。app权限被分为几个等级,具体的自己搜索了解下哈,这里重点在需要动态申请的权限。这些权限中被分了组,即:一旦组内某个权限被允许,该组的其他权限也是被允许的。
当然,避开这些是没问题的,将targetSdkVersion设在23以下就行了,即使在Android 6.0的手机上也是按照之前的方式处理权限:同意安装即视为同意所有权限。所以这么干就能短时间避开这种问题。
那我硬要用23呢!?这话没错,有新的东西出来必须得支持一下,长期targetSdkVersion 22也不是个事儿。
所以来试试这个东西,利用RxJava解决权限问题。
简单粗暴的玩法:不在真正的运行时使用权限申请,而是先一步。怎么说,就是在使用权限的上一页插入一个页面专门用来处理权限问题,用户同意就跳转下一页进入真正使用的地方。如下图:
这里我们拒绝
啥?用户不不同意?
还有一次机会,不过这次多了一个checkbox:
我们继续拒绝
啥?还是不同意,所以用户安装你app是想怎么用?上天?
让他自己去打开吧。。。。应用详情里面,而且!就是同意了权限,用户也可以在这里直接给你关掉曾经允许的权限。。。这个比较蛋疼。
具体怎么弹出这个申请过程呢?
app的build.gradle:
dependencies {
compile 'com.tbruyelle.rxpermissions:rxpermissions:0.7.0@aar'
compile 'io.reactivex:rxjava:1.1.6'
新建的一个activity里面的oncreat方法里初始化:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
RxPermissions.getInstance(this)
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.WRITE_EXTERNAL_STORAGE)//这里申请了两组权限
.subscribe(new Action1&Boolean&() {
public void call(Boolean granted) {
if (granted) {
//同意后跳转
LaunchActivity.this.startActivity(new Intent(LaunchActivity.this, LoginActivity.class));
LaunchActivity.this.finish();
//不同意,给提示
Toast.makeText(LaunchActivity.this, "请同意软件的权限,才能继续提供服务", Toast.LENGTH_LONG).show();
这样处理后基本就可以用了,是不是很快!?手动抠鼻~
4.再说点儿
①像真正在使用时才弹出申请的过程、更实际的点击按钮(如拍照)才弹出权限申请可以到该项目去瞅瞅,这货的源码也是一个学习rxjava的好例子。
②再者,不知道为什么rxjava患者大多喜欢使用lambda,谁给解释解释~本来上面的示例代码也是用的lambda语法,代码确实短了很多,但是为了理解简易起见给换回来了。
本文作者:paradoxie
个人主页:
简书地址:
github地址:
转载请注明出处,蟹蟹!
-------我的梦想真的是做一条咸鱼!
爱跑步;听民谣;二刺螈;编小说;写诗词。创业中。认知浅陋的码渣。
简书只发表技术文。更多文章请转向个人地址:http://www.paradoxie.cf/Android 6.0动态权限申请_Linux编程_Linux公社-Linux系统门户网站
你好,游客
Android 6.0动态权限申请
来源:Linux社区&
作者:loongago
从 6.0开始,有部分危险权限申请需要在运行时候申请,一般是你的目标版本targetSdkVersion大于或等于23就要动态申请权限了,否则APP在运行当中会崩溃。
在 Server 14.04上编译Android 6.0源码
Android 6.0百度网盘下载
一、基础知识
1、权限种类
权限分两种:正常权限和危险权限。危险权限在targetSdkVersion大于或等于23就要动态申请权限了。危险权限有以下几种:
权限组权限
READ_CALENDAR
WRITE_CALENDAR
READ_CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS
ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
MICROPHONE
RECORD_AUDIO
WRITE_CALENDAR
READ_PHONE_STATE
CALL_PHONE
READ_CALL_LOG
WRITE_CALL_LOG
ADD_VOICEMAIL
PROCESS_OUTGOING_CALLS
BODY_SENSORS
RECEIVE_SMS
RECEIVE_WAP_PUSH
RECEIVE_MMS
READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE
每组权限中,用户只要授权该组下的一个权限,该组中所有权限都可以用。
2、权限相关
是否需要向用户解析需要申请的权限。
ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_CONTACTS)
如果应用之前请求过此权限但用户拒绝了请求,此方法将返回 true。 如果用户在过去拒绝了权限请求,并在权限请求系统对话框中选择了 Don&t ask again 选项,此方法将返回 false。 如果设备规范禁止应用具有该权限,此方法也会返回 false。所以第一次进入APP申请该权限时,有些设备会返回false(第二次申请才为true)。
检查APP是否已经有权限。
ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.READ_CONTACTS)
返回PackageManager.PERMISSION_GRANTED表示已拥有,不具有则返回PackageManager.PERMISSION_DENIED
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS)
ActivityCompat.requestPermissions用于申请权限。 thisActivity,不用多说了,就是当前的Activity名字的一个实例(引用)。 new String[]{Manifest.permission.READ_CONTACTS}是你要申请的权限,你可以写几个权限进入数组里申请。 MY_PERMISSIONS_REQUEST_READ_CONTACTS为你自己定义一个对应的号码,方便系统回调时识别。
处理权限请求响应
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
这里处理的是权限相应结果。 requestCode对应之前的你自己定义的号码MY_PERMISSIONS_REQUEST_READ_CONTACTS。 grantResults是权限申请结果数组。其结果可以是PackageManager.PERMISSION_GRANTED或PackageManager.PERMISSION_DENIED
跳转到用户权限管理页面
Intent intent = new Intent()
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
Log.d(TAG, "getPackageName(): " + activity.getPackageName())
Uri uri = Uri.fromParts("package", activity.getPackageName(), null)
intent.setData(uri)
activity.startActivity(intent)
AndroidManifest里填写
这里填写的权限和普通的权限相差无异。
android:name="android.permission.READ_CONTACTS" /&
android:name="android.permission.WRITE_CONTACTS" /&
二、权限申请
单权限申请
下面来实现一个单权限的申请。
package com.example.
import android.M
import android.app.A
import android.content.DialogI
import android.content.I
import android.content.pm.PackageM
import android.net.U
import android.os.B
import android.provider.S
import android.support.annotation.NonN
import android.support.design.widget.S
import android.support.v4.app.ActivityC
import android.support.v7.app.AlertD
import android.support.v7.app.AppCompatA
import android.util.L
import android.view.V
import android.widget.T
public class MainActivity extends AppCompatActivity implements ActivityCompat.OnRequestPermissionsResultCallback {
private static String TAG = "MainActivity";
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mLayout = findViewById(R.id.activity_main);
public boolean shouldShowRequestPermissionRationale(String permission) {
return super.shouldShowRequestPermissionRationale(permission);
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
openSettingActivity(this, "没有此权限,无法开启这个功能,请开启权限。PERMISSION_READ_ACCOUNTS 和 PERMISSION_GET_ACCOUNTS" );
private static void openSettingActivity(final Activity activity, String message) {
showMessageOKCancel(activity, message, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Log.d(TAG, "getPackageName(): " + activity.getPackageName());
Uri uri = Uri.fromParts("package", activity.getPackageName(), null);
intent.setData(uri);
activity.startActivity(intent);
private static void showMessageOKCancel(final Activity context, String message, DialogInterface.OnClickListener okListener) {
new AlertDialog.Builder(context)
.setMessage(message)
.setPositiveButton("OK", okListener)
.setNegativeButton("Cancel", null)
public void showContacts(View v) {
Log.i(TAG, "Show contacts button pressed. Checking permissions.");
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED
|| ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
Log.i(TAG, "Contact permissions has NOT been granted. Requesting permissions.");
requestContactsPermissions();
private static String[] PERMISSIONS_CONTACT = {Manifest.permission.READ_CONTACTS,
Manifest.permission.WRITE_CONTACTS};
* Id to identify a contacts permission request.
private static final int REQUEST_CONTACTS = 1;
* 申请权限
private void requestContactsPermissions() {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_CONTACTS)
|| ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_CONTACTS)) {
Log.i(TAG,
"Displaying contacts permission rationale to provide additional context.");
Snackbar.make(mLayout, "Contacts permissions are needed to demonstrate access.", Snackbar.LENGTH_INDEFINITE)
.setAction("ok", new View.OnClickListener() {
public void onClick(View view) {
ActivityCompat.requestPermissions(MainActivity.this, PERMISSIONS_CONTACT, REQUEST_CONTACTS);
ActivityCompat.requestPermissions(this, PERMISSIONS_CONTACT, REQUEST_CONTACTS);
权限申请清单
android:name="android.permission.READ_CONTACTS" /&
android:name="android.permission.WRITE_CONTACTS" /&
实现流程: 1.检查是否有该权限 2.检查是否解析受限,如果有则直接申请权限,没有则弹窗提示用户申请权限。 3.系统回调onRequestPermissionsResult反馈申请结果。 4.如果用户拒绝就弹窗提示是否跳转到设置里面的应用软件权限设置页面。
多权限申请
多权限申请和单权限申请类似,在申请时候申请多个而已。
List&string& requestPermissions = new ArrayList&string&()
requestPermissions.add(Manifest.permission.RECORD_AUDIO)
requestPermissions.add(Manifest.permission.GET_ACCOUNTS)
requestPermissions.add(Manifest.permission.READ_PHONE_STATE)
requestPermissions.add(Manifest.permission.CALL_PHONE)
requestPermissions.add(Manifest.permission.CAMERA)
requestPermissions.add(Manifest.permission.ACCESS_FINE_LOCATION)
requestPermissions.add(Manifest.permission.ACCESS_COARSE_LOCATION)
requestPermissions.add(Manifest.permission.READ_EXTERNAL_STORAGE)
requestPermissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE)
ActivityCompat.requestPermissions(MainActivity.this, requestPermissions.toArray(new String[requestPermissions.size()]), REQUEST_CONTACTS)
记得在AndroidManifest里填写对应的权限。
android:name="android.permission.READ_CONTACTS" /&
android:name="android.permission.WRITE_CONTACTS" /&
android:name="android.permission.CAMERA"/&
android:name="android.permission.ACCESS_FINE_LOCATION"/&
android:name="android.permission.ACCESS_COARSE_LOCATION"/&
android:name="android.permission.CALL_PHONE"/&
android:name="android.permission.SEND_SMS"/&
android:name="android.permission.READ_SMS"/&
android:name="android.permission.GET_ACCOUNTS"/&
android:name="android.permission.READ_PHONE_STATE"/&
android:name="android.permission.READ_EXTERNAL_STORAGE"/&
android:name="android.permission.WRITE_EXTERNAL_STORAGE"/&
android:name="android.permission.RECORD_AUDIO"/&
相关资料链接:
谷歌Demo地址:
本文Demo到Linux公社资源站下载:
------------------------------------------分割线------------------------------------------
免费下载地址在
用户名与密码都是
具体下载目录在 /2017年资料/1月/17日/Android 6.0动态权限申请/
下载方法见
------------------------------------------分割线------------------------------------------
更多Android相关信息见 专题页面
本文永久更新链接地址:
相关资讯 & & &
& (01/11/:02)
& (10/29/:50)
& (09/08/:53)
& (11/07/:20)
& (10/24/:17)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款Android 6.0运行时权限勾选不再询问后该如何处理? - 简书
Android 6.0运行时权限勾选不再询问后该如何处理?
【威哥说】上文给大家讲解了android运行时权限的使用,本文讲解下当用户勾选不再询问后的权限该如何处理。当第一次请求权限申请被拒绝后再进行第二次申请时,对话框中会多出一个 不再询问 的复选框。如果勾选了该复选框并且拒绝请求,那么以后将无法再申请该权限。也就是说在调用 requestPermissions() 后,onRequestPermissionsResult() 会立刻被调用并且申请结果为 PERMISSION_DENIED 。 其实这个时候还是有一根救命稻草的。判断是否勾选不再询问首先需要判断用户是否勾选了不再询问。@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {switch (requestCode){case MY_PERMISSIONS_APPLY:for (int i = 0; i & grantResults. i++) {//判断权限的结果,如果有被拒绝,就returnif (grantResults[i] == PackageManager.PERMISSION_DENIED){if (!ActivityCompat.shouldShowRequestPermissionRationale(this,permissions[i])){showToast("点击权限,并打开全部权限");Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);Uri uri = Uri.fromParts("package", getPackageName(), null);intent.setData(uri);startActivityForResult(intent, REQUEST_PERMISSION_SETTING);}ActivityCompat 位于 support.v7 包中,因为运行时权限是 6.0 的新特性,使用该类可以省略对版本的判断当权限申请被拒绝并且shouldShowRequestPermissionRationale() 返回 false 就表示勾选了不再询问。转到设置界面现在我们唯一能做的就是跳转到我们 App 的设置界面,让用户手动开启权限了。也就是这几行代码,上面已经贴出,方便大家参考:Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);Uri uri = Uri.fromParts("package", getPackageName(), null);intent.setData(uri);startActivityForResult(intent, REQUEST_PERMISSION_SETTING);·当然,你也可以先弹出对话框询问用户是否要授予权限,然后再跳转。跳转到设置界面调用的是 startActivityForResult() 而不是 startActivity() 。在 onActivityResult() 中没有必要对 resultCode 进行判断,因为用户只能通过返回键才能回到我们的 App 中,所以 resultCode 总是为 RESULT_CANCEL。在 onActivityResult() 中还需要对权限进行判断,因为用户有可能没有授权就返回了!
我当Java为初恋,每时每刻把她念;千万Bug不可怕,耐心细致征服她。关注微信公众号∶mjw-java,每天与你技术分享,陪伴你迎接早晨的第一缕阳光,让学习成为习惯。优就业程序开发教程-Android 6.0 运行时权限处理_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
优就业程序开发教程-Android 6.0 运行时权限处理
上传于|0|0|暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩4页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢}

我要回帖

更多关于 android的6.0权限申请 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信