美文网首页
【基础笔记】重新认识android权限

【基础笔记】重新认识android权限

作者: 究极无敌棒棒糖 | 来源:发表于2019-12-10 16:19 被阅读0次

一、为什么要申请android权限

为了保护好用户的安全和隐私,android开发团队从系统的第一个版本就引入了权限机制。android 6.0系统之前,权限机制的作用比较有限。android 6.0系统之后,android开发团队就引用了运行时权限,从而更好的保护了用户的安全和隐私。使用读写内存,网络请求,地位等功能时就要申请android权限,如果不在AndroidManifest.xml中加入权限声明,我们的程序就会崩溃。

二、android权限的机制

1. 安卓6.0之前授权
如果用户在低于6.0系统的设备上安装该程序,会在安装界面给出如图所示的提醒。这样用户就可以清楚地知晓该程序一共申请了哪些权限,从而决定是否要安装这个程序。
这种权限机制的设计思路其实非常简单,就是用户如果认可你所申请的权限,那么就会安装你的程序,如果不认可你所申请的权限,那么拒绝安装就可以了。但是常用软件普遍存在着滥用权限的情况,Android开发团队也意识到了这个问题,于是在6.0系统中加入了运行时权限功能。

6.0前安装页面.png
2.安卓 6.0之后的授权
用户不需要在安装软件的时候一次性授权所有申请的权限,而是可以在软件的使用过程中再对某一项权限申请进行授权。比如说一款相机应用在运行时申请了地理位置定位权限,就算我拒绝了这个权限,但是我应该仍然可以使用这个应用的其他功能,而不是像之前那样直接无法安装它。
3. 权限的分类
  • 普通权限:指的是那些不会直接威胁到用户的安全和隐私的权限,对于这部分权限申请,系统会自动帮我们进行授权,而不需要用户再去手动操作了。
  • 危险权限:表示那些可能会触及用户隐私或者对设备安全性造成影响的权限,如获取设备联系人信息、定位设备的地理位置等,对于这部分权限申请,必须要由用户手动点击授权才可以,否则程序就无法使用相应的功能。
权限组名 权限名
CALENDAR READ_CALENDAR、WRITE_CALENDAR
CAMERA CAMERA
CONTACTS READ_CONTACTS、WRITE_CONTACTS、GET_ACCOUNTS
LOCATION ACCESS_FINE_LOCATION、ACCESS_COARSE_LOCATION
MICROPHONE RECORD_AUDIO
PHONE READ_PHONE_STATE、CALL_PHONE、READ_CALL_LOG、WRITE_CALL_LOG、ADD_VOICEMAIL、USE_SIP、PROCESS_OUTGOING_CALLS
SENSORS BODY_SENSORS
SMS SEND_SMS、RECEIVE_SMS、READ_SMS、RECEIVE_WAP_PUSH、RECEIVE_MMS
STORAGE READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE

三、在程序运行时请求权限(安卓6.0之后,在activity中申请)

点击拨打电话功能(Android Studio3.1)

1、AndroidManifest添加拨打电话权限

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

添加在manifest下,与application同级

2、xml布局

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/btn_call"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</android.support.constraint.ConstraintLayout>

3、Activity

package com.example.administrator.drawable;

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

/**
 * Create by Administrator on ${DATA}
 */
public class CallPhone extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.call_phone);
        Button button = findViewById(R.id.btn_call);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (ContextCompat.checkSelfPermission(CallPhone.this,Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED){
                    ActivityCompat.requestPermissions(CallPhone.this,new String[]{Manifest.permission.CALL_PHONE},1);
                }else {
                    callPhone();
                }
            }
        });
    }

    private void callPhone() {
        Intent intent = new Intent(Intent.ACTION_CALL);
        intent.setData(Uri.parse("tel:10086"));
        startActivity(intent);
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case 1:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.
                        PERMISSION_GRANTED) {
                   callPhone();
                }else{
                    Toast.makeText(MainActivity.this,"您取消了申请权限",Toast.LENGTH_LONG).show();
                }
                break;
            default:
                break;
        }
    }
}

1、ContextCompat.checkSelfPermission方法检查是否有拨打电话的权限,第一参数是当前activity,第二个参数是权限的名称。检查有拨打电话权限可直接调用拨打的方法,没有权限使用ActivityCompat.requestPermissions请求权限。
2、ActivityCompat.requestPermissions方法请求对应权限,第一个参数为当前activity,第二个参数是权限名的数组,第三个参数是请求码(请求码为1就可以了)。
3、无论用户同意或拒绝都会回到回调方法onRequestPermissionsResult中,而授权的结果则会封装在grantResults 参数当中。这里我们只需要判断一下最后的授权结果,如果用户同意的话就调用callPhone() 方法来拨打电话,如果用户拒绝的话我们只能放弃操作,并且弹出一条失败提示。

相关文章

网友评论

      本文标题:【基础笔记】重新认识android权限

      本文链接:https://www.haomeiwen.com/subject/ybmegctx.html