Android 6.0版本以后运行时权限提醒

Android发布6.0以后对app运行所需要的权限提示进行了友好的提示,类似于苹果系统,比如在某个页面要用到打电话的权限,会弹出一个提示框,提示你是否需要同意这个权限,如果同意则app就有了打电话的权限,既可以拨打电话了,不同意则不能拨打电话,只能去设置中勾选,在6.0以前,权限配置都是在AndroidManifest.xml文件中添加例如:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.ymx.dynamicpermissiondemo">

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
    <uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>

</manifest>

在配置文件中添加了两个权限,一个是网络状态,一个是打电话权限。

在代码中设置拨打电话:

public class MainActivity extends AppCompatActivity {

    private Button mCallButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mCallButton = (Button) findViewById(R.id.call_button);

        mCallButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent callIntent = new Intent();
                callIntent.setAction(Intent.ACTION_CALL);
                callIntent.setData(Uri.parse("tel:" + "10086"));
                startActivity(callIntent);
            }
        });

    }
}

电话能够正常拨打出去

如果没有注册权限的话,就会报相关异常了:

 FATAL EXCEPTION: main
                                                                                     Process: com.example.ymx.dynamicpermissiondemo, PID: 3147
                                                                                     java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.CALL dat=tel:xxxxxxx cmp=com.android.server.telecom/.CallActivity } from ProcessRecord{3d45b392 3147:com.example.ymx.dynamicpermissiondemo/u0a59} (pid=3147, uid=10059) requires android.permission.CALL_PHONE
                                                                                         at android.os.Parcel.readException(Parcel.java:1546)

现在来看看Android6.0版本是怎么实现运行时权限提醒的,首先在app的gradle中配置targetSdkVersion=25

package com.example.ymx.dynamicpermissiondemo;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private Button callButton;
    private static final int PERMISSION_REQUEST_CODE = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        callButton = (Button) findViewById(R.id.call_button);

        callButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
            checkPermission();
            }
        });

    }
    //检测用户是否同意权限
    private void checkPermission(){
        //判断所申请的权限是不是已经通过,没通过返回false,通过返回true,则提示出来并拨打电话
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE)!= PackageManager.PERMISSION_GRANTED){
            //申请权限回调函数
            ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CALL_PHONE},PERMISSION_REQUEST_CODE);
        }else{
            Toast.makeText(this,"权限已被申请通过咯!",Toast.LENGTH_SHORT).show();
            call();
        }
    }
    //打电话方法
    private void call(){
        Intent callIntent = new Intent();
        callIntent.setAction(Intent.ACTION_CALL);
        callIntent.setData(Uri.parse("tel://10086"));
        startActivity(callIntent);
    }
    //权限申请回调方法
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode){
            case PERMISSION_REQUEST_CODE:
                //同意申请的权限
                if (grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){
                    Toast.makeText(this,"同意通过",Toast.LENGTH_SHORT).show();
                    call();
                    //拒绝申请的权限
                }else{
                    Toast.makeText(this,"拒绝通过",Toast.LENGTH_SHORT).show();
                }
                break;
            default:
                break;
        }

    }
}

可以看出来,定义很简单,在activity中写了三个方法,分别是打电话,权限校验,权限申请的回调函数,校验权限方法主要是用到了ContextCompat.checkSelfPermission方法,里边接收两个参数,第一个是activity的实例,第二个是你要申请的权限名称,PackageManager.PERMISSION_GRANTED这个参数表示权限已经通过的意思,和ContextCompat.checkSelfPermission的返回结果进行比较,然后做相应处理,如果已经通过了就Toast出来,然后直接拨打电话??,如果没有通过,就请求回调申请权限方法,

方法是ActivityCompat.requestPermissions,里边接收三个参数,一个是activity的实例,第二个是多个权限名称数组,第三个是requestCode,这个requestCode是不是很眼熟,和startActivityForResult中的一样,区分不同权限处理。

在onRequestPermissionsResult中判断用户是不是通过了某个权限,使用的是int[] grantResults参数,先判断它的长度,角标为0表示通过,即PackageManager.PERMISSION_GRANTED,角标为1表示未通过,即PackageManager.PERMISSION_DENIED,来看一下运行效果吧~~~

最后还是别忘了在AndroidManifest.xml中注册相关的uses-permission,这个是不管哪个版本都需要注册的~~~????。

以上只是介绍了6.0版本设置动态权限提醒的基本用法,当要一下申请好多个权限的时候,得想想怎么修改这些逻辑了,

时间: 2024-10-04 11:50:05

Android 6.0版本以后运行时权限提醒的相关文章

Android 6.0以上 需要运行时申请的权限

转载:http://www.cnblogs.com/tangs/articles/6377347.html 自从Android6.0发布以来,在权限上做出了很大的变动,不再是之前的只要在manifest设置就可以任意获取权限,而是更加的注重用户的隐私和体验,不会再强迫用户因拒绝不该拥有的权限而导致的无法安装的事情,也不会再不征求用户授权的情况下,就可以任意的访问用户隐私,而且即使在授权之后也可以及时的更改权限.这就是6.0版本做出的更拥护和注重用户的一大体现. 一.认知 今天我们就来学习下And

【Android运行时权限申请快速学习教程】

1. Android权限介绍 Android权限是Android应用在设备上运行所需要的权力,义务就是为用户带来此Android应用的功能. 问题来源:在Android6.0版本之前,根据App在AndroidManifest申请的权限,在安装此App的时候进行提示权限允许,不允许就不给装不给用,那么我们只能默默的忍受这个APP对我们隐私的侵蚀(Eg.通讯录的读取权限). 解决办法:后来Google发现,诶,这样会导致Android用户们想用这个APP的某些功能而不能用.因此,在Android6

Android 6.0+ 运行时权限探索

原创文章,转载请注明 ( 来自:http://blog.csdn.net/leejizhou/article/details/51511630 李济洲的博客 ) 引言:去年Android 6.0发布后,其新引入的(Requesting Permissions at Run Time)运行时权限就备受开发者关注,随着今年国内手机厂商对6.0系统的普及,觉得大家有必要了解下这个新特性,因为在TargetSDK23+进行开发不注意这些会造成APP运行在6.0+手机上崩溃,这篇博文将对这个新特性进行探索

Android6.0运行时权限(基于RxPermission开源库)

版权声明:本文为博主原创文章,未经博主允许不得转载. 前言 在6.0以前的系统,都是权限一刀切的处理方式,只要用户安装,Manifest申请的权限都会被赋予,并且安装后权限也撤销不了. Android 6.0 采用新的权限模型,只有在需要权限的时候,才告知用户是否授权:是在runtime时候授权,而不是在原来安装的时候 ,同时默认情况下每次在运行时打开页面时候,需要先检查是否有所需要的权限申请. 判断是否是需要运行时权限的标记就是targetSDKVersion. 当targetSDKVersi

Android 6.0 运行时权限处理完全解析

一.概述 随着Android 6.0发布以及普及,我们开发者所要应对的主要就是新版本SDK带来的一些变化,首先关注的就是权限机制的变化.对于6.0的几个主要的变化,查看查看官网的这篇文章http://developer.android.com/intl/zh-cn/about/versions/marshmallow/android-6.0-changes.html,其中当然包含Runtime Permissions. ok,本篇文章目的之一就是对运行时权限处理的一个介绍,以及对目前权限相关的库

Android 6.0的运行时权限

原文  http://droidyue.com/blog/2016/01/17/understanding-marshmallow-runtime-permission/ 主题 安卓开发 Android 6.0,代号棉花糖,自发布伊始,其主要的特征运行时权限就很受关注.因为这一特征不仅改善了用户对于应用的使用体验,还使得应用开发者在实践开发中需要做出改变. 没有深入了解运行时权限的开发者通常会有很多疑问,比如什么是运行时权限,哪些是运行时的权限,我的应用是不是会在6.0系统上各种崩溃呢,如何才能

谈谈Android 6.0运行时权限理解

前言 谷歌在2015年8月份时候,发布了Android 6.0版本,代号叫做“棉花糖”(Marshmallow ),其中的很大的一部分变化,是在用户权限授权上,或许是感觉之前默认授权的不合理,现在6.0出来,使得用户权限授权变得合理.这可能也是参考IOS系统的,只有在用户需要使用权限的时候,才去授权请求,这样做的目的是提高用户体验,当然,用户感觉好了,受苦的是我们开发人员,原来的规则不适用了,现在我们去适应新的规则,毕竟是靠谷歌这颗大树吃饭的嘛. 原来权限模型 在Android 6.0版本之前,

聊一聊 Android 6.0 的运行时权限

权限一刀切 棉花糖运行时权限 权限的分组 正常权限 正常权限列表 特殊权限危险权限 请求SYSTEM_ALERT_WINDOW 请求WRITE_SETTINGS 必须要支持运行时权限么 不支持运行时权限会崩溃么 然而有点糟糕的是 该来的还得来 一个标准的流程 如何批量申请 申请这么多权限岂不是很累 注意事项两个权限 API问题 多系统问题 些许建议 注意 Android 6.0,代号棉花糖,自发布伊始,其主要的特征运行时权限就很受关注.因为这一特征不仅改善了用户对于应用的使用体验,还使得应用开发

Android 6.0 运行时权限处理

运行时权限介绍 Android 6.0在我们原有的AndroidManifest.xml声明权限的基础上,又新增了运行时权限动态检测,以下权限都需要在运行时判断: 身体传感器 日历 摄像头 通讯录 地理位置 麦克风 电话 短信 存储空间 运行时权限处理 Android6.0系统默认为targetSdkVersion小于23的应用默认授予了所申请的所有权限,所以如果你以前的APP设置的targetSdkVersion低于23,在运行时也不会崩溃,但这也只是一个临时的救急策略,用户还是可以在设置中取