Android6.0运行时权限处理

前言

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

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

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

Demo:模拟直接拨打电话

  1. 首先在Manifest.xml中添加拨打电话权限
<!--拨打电话权限-->
<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>
  1. main_activity.xml文件中添加布局文件如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.sean.css.runtimepermissiontest.MainActivity">

    <Button
        android:id="@+id/make_call"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="拨打10080" />
</RelativeLayout>
  1. MainActivity.xml文件中
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的运行时权限处理,特此记录。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值