第一行代码 第7章 内容提供器 -- 运行时权限

来源:互联网 发布:犀牛软件 下载 编辑:程序博客网 时间:2024/05/21 17:53

Android运行时权限:
由android 6.0系统上引入了这个功能 , 允许用户在安装软件时不需要一次性授权所有的申请权限,而是可以在运行时对某一项权限申请进行授权。

Android将权限分为两类
一类是普通权限:不会直接威胁到用户安全和隐私的权限,由系统自动授权。
一类是危险权限:涉及用户隐私,和对设备安全性的权限,由用户手动授权,否则该应用程序无法使用该功能。

android的威胁权限一共是9组,24个权限。

权限组名        权限名CAMERA          CAMERALOCATION        ACCESS_FINE_LOCATION                ACCESS_COARSE_LOCATIONMICROPHONE      RECOED_AUDIOSENSORS         BODY_SESORSCALENDAR        READ_CALENDAR                WRITE_CALENDARCONTACTS        READ_CONTACTS                WRITE_CONTACTS                GET_ACCOUNTSSTORAGE         READ_EXTERNAL_STORAGE                WRITE_EXTERNAL_STORAGESMS             SEND_SMS                RECEIVE_SMS                READ_SMS                RECEIVE_MMS                RECEIVE_WAP_PUSHPHONE           READ_PHONE_STATE                CALL_PHONE                READ_CALL_LOG                WRITE_CALL_LOG                ADD_VOICEMAIL                USE_SIP                PROCESS_OUTGOING_CALLS

在进行运行时权限处理时,使用的是权限名,用户一旦同意授权了,那么该权限所对应的权限组中所有的其他权限也会同时被授权。

拨打电话功能实例:
AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.sky.runtimepermissiondemo">    <uses-permission android:name="android.permission.CALL_PHONE" />    <application        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:supportsRtl="true"        android:theme="@style/AppTheme">        <activity android:name=".MainActivity">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>    </application></manifest>

MainActivity.java

public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Button btnCall = (Button)findViewById(R.id.btnCall);        btnCall.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                  try {                      Intent intent = new Intent(Intent.ACTION_CALL);                      intent.setData(Uri.parse("tel:10086"));                      startActivity(intent);                  } catch (SecurityException e) {                      e.printStackTrace();                  }          }       });    }}

此程序在低于Android 6.0 系统的手机上都可以正常运行,但是在6.0或者更高版本系统的手机上运行,就会出现”Permission Denial”错误信息。所以需要进行运行时权限处理

运行时权限处理流程:
1、判断用户是否已经给过授权了。
使用ContextCompat.checkSelfPermission()方法。
该方法接收两个参数
第一个参数是Context
第二个参数是具体的权限名

然后利用该方法的返回值和PackageManager.PERMISSION_GRANTED做比较。
如果相等,则说明已经授权过,可以直接运行需要授权的程序;
如果不相等,则说明没有授权过,需要向用户申请授权。使用ActivityCompat.requestPermission()方法进行申请
该方法接收3个参数
第一个参数是Activity的实例
第二个参数是String数组,把要申请的权限名放在数组中
第三个参数是请求码

当调用requestPermission()方法以后,系统会弹出一个权限申请的对话框,由用户选择是否同意权限的申请。不管是同意还是拒绝,最终都会回调onRequestPermissionResult()方法。
该方法有三个参数
第一个参数requestCode,是requestPermission方法中传入的请求码
第二个参数permissions数组,是requestPermission方法中传入的String数组
第三个参数grantResults数组,是授权的结果

当用户同意权限后,就不再弹出一个权限申请的对话框,直接执行代码。

将MainActivity.java改成如下:

public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Button btnCall = (Button)findViewById(R.id.btnCall);        btnCall.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 {                    try {                        Intent intent = new Intent(Intent.ACTION_CALL);                        intent.setData(Uri.parse("tel:10086"));                        startActivity(intent);                    } catch (SecurityException e) {                        e.printStackTrace();                    }                }            }        });    }    @Override    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {        switch (requestCode){            case 1:                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){                    try {                        Intent intent = new Intent(Intent.ACTION_CALL);                        intent.setData(Uri.parse("tel:10086"));                        startActivity(intent);                    } catch (SecurityException e) {                        e.printStackTrace();                    }                }else {                    Toast.makeText(this, "You denied the permission", Toast.LENGTH_SHORT).show();                }                break;            default:        }    }}
阅读全文
0 0
原创粉丝点击