博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 6.0版本以后运行时权限提醒
阅读量:6249 次
发布时间:2019-06-22

本文共 4967 字,大约阅读时间需要 16 分钟。

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

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

在代码中设置拨打电话:

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版本设置动态权限提醒的基本用法,当要一下申请好多个权限的时候,得想想怎么修改这些逻辑了,

 

转载于:https://www.cnblogs.com/ylt-niuniu/p/6536419.html

你可能感兴趣的文章
TP框架中APP_SUB_DOMAIN_DEPLOY什么意思?
查看>>
DirectUI的优点及其自定义控件的开发
查看>>
用UglifyJS2合并压缩混淆JS代码
查看>>
Angular2入门:TypeScript的类型 - 对象解构
查看>>
apache spark kubernets 部署试用
查看>>
Windows下python3生成UTF8的CSV文件和sha256sum踩坑记录
查看>>
SPIHT 编码原理,代码,应用,专利问题
查看>>
JBPM4 读书笔记点滴
查看>>
Ext.net 动态生成控件
查看>>
10个强大的Javascript表单验证插件推荐
查看>>
神奇HVXC的MOS 分
查看>>
用SQL游标将1列中的数据分解成3列
查看>>
free 与 delete
查看>>
Qt之对话框设计——可扩展对话框
查看>>
【dotnetfx】Microsoft .NET Framework 3.5 sp1离线安装解决方案
查看>>
<===最困难的时候,就是距离成功不远了===>
查看>>
在图片上显示左右箭头的翻页代码
查看>>
eclipse插件开发--获取当前项目路径
查看>>
Oracle多行数据的合并
查看>>
从零开始编写自己的C#框架(3)——开发规范
查看>>