博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android进阶 Android6 0运行时权限处理
阅读量:7112 次
发布时间:2019-06-28

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

前言

Android6.0版本以前,往往是应用程序需要什么权限直接在manifest.xml中直接声明,当你安装程序的时候,如果不想让该程序使用某种权限,唯一的办法只能是不装这个应用,但是我们生活中离不开应用,只能是默默的接受无耻的权限要求,比如一个聊天软件要获取你的短信、彩信等权限,明明就是明抢,我们平时又使用不到这些权限,Google也考虑到了这个问题,所以在Android6.0之后加入了运行时权限,把权限分为危险权限和普通权限。

  1. 普通权限 不会直接威胁到用户的安全和隐私的权限

  2. 危险权限 可能会触及用户的隐私、或者对用户的设备安全性造成影响的权限,危险权限总共有9组24个权限

Demo:模拟直接拨打电话

  1. 首先在Manifest.xml中添加拨打电话权限
复制代码
  1. main_activity.xml文件中添加布局文件如下:
复制代码
  1. MainActivity.java文件中
package com.sean.css.runtimepermissiontest;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 {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Button button = (Button) findViewById(R.id.make_call);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                //判断是否已经获得了拨打电话权限                if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {                    //没有获得拨打电话权限就去请求获得该权限,第一个参数是上下文对象,第二个参数是权限名称,第三个参数是请求码                    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE}, 1);                } else {                    call();                }            }        });    }    private void call() {        try {            Intent intent = new Intent(Intent.ACTION_CALL);            intent.setData(Uri.parse("tel:10086"));            startActivity(intent);        } catch (SecurityException e) {            e.printStackTrace();        }    }    /**     * 申请权限回调     *     * @param requestCode     * @param permissions     * @param grantResults     */    @Override    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        switch (requestCode) {            case 1:                //如果是返回的请求码是1,知道是申请拨打电话权限的回调。                //授权的结果在grantResults中,如果长度大于0并且里面的值表示以获取该权限,就直接拨打电话                //否则跳出提示,告诉用户为什么需要该权限,让用户自己开启权限                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {                    call();                } else {                    Toast.makeText(this, "你需要允许拨打电话权限才能进行下面的操作", Toast.LENGTH_SHORT).show();                }                break;        }    }}复制代码

当我们申请运行时权限的时候,是不是有点似曾相识的感觉呢? 我们在使用开启新的Activity并且需要新的Activity返回给我们值的时候,和申请权限的是相似的,这样就好理解多了。

其他

现在的开源项目有很多已经帮我们封装好了申请运行时权限,我们可以直接拿来用,比如easypermissions等,不过还是要知道其中的原理比较好。

Android6.0的运行时权限处理,特此记录。

你可以通过以下方式关注我:

转载地址:http://pfwel.baihongyu.com/

你可能感兴趣的文章
Bootstrap学习笔记系列5------Bootstrap图片显示
查看>>
CentOS服务器下对mysql的优化
查看>>
linux内核模块开发
查看>>
android 小结
查看>>
【转】Android 基于Socket的聊天室
查看>>
小记录
查看>>
ubuntu安装完无法用xshell,远程链接
查看>>
C# 对象哈希码
查看>>
高效的JS数组操作
查看>>
Oracle计算时间差函数
查看>>
Jenkins入门系列之——01第一章 Jenkins是什么?
查看>>
在Ubuntu上搭建hive环境
查看>>
二分法查找
查看>>
hmac检验客户端合法性
查看>>
python-webbrowser模块 浏览器操作
查看>>
map侧连接
查看>>
数据库---数据库查询的各种子句
查看>>
vue+Mint-ui实现登录注册
查看>>
asp.net记住我功能
查看>>
[java web]Idea+maven+spring4+hibernate5+struts2整合过程
查看>>