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

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

<?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>

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

在代码中设置拨打电话:数组

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);
            }
        });

    }
}

电话可以正常拨打出去网络

若是没有注册权限的话,就会报相关异常了:app

 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=25ide

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中的同样,区分不一样权限处理。gradle

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

最后仍是别忘了在AndroidManifest.xml中注册相关的uses-permission,这个是无论哪一个版本都须要注册的~~~😁😁。this

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

相关文章
相关标签/搜索