Android 6.0版本之後運行時權限提醒

     Android發佈6.0之後對app運行所須要的權限提示進行了友好的提示,相似於蘋果系統,好比在某個頁面要用到打電話的權限,會彈出一個提示框,提示你是否須要贊成這個權限,若是贊成則app就有了打電話的權限,既能夠撥打電話了,不一樣意則不能撥打電話,只能去設置中勾選,在6.0之前,權限配置都是在AndroidManifest.xml文件中添加例如:java

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.ymx.dynamicpermissiondemo">

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

在配置文件中添加了兩個權限,一個是網絡狀態,一個是打電話權限。android

在代碼中設置撥打電話:數組

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);
            }
        });

    }
}

電話可以正常撥打出去網絡

若是沒有註冊權限的話,就會報相關異常了:app

 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=25ide

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中的同樣,區分不一樣權限處理。gradle

在onRequestPermissionsResult中判斷用戶是否是經過了某個權限,使用的是int[] grantResults參數,先判斷它的長度,角標爲0表示經過,即PackageManager.PERMISSION_GRANTED,角標爲1表示未經過,即PackageManager.PERMISSION_DENIED,來看一下運行效果吧~~~ui

最後仍是別忘了在AndroidManifest.xml中註冊相關的uses-permission,這個是無論哪一個版本都須要註冊的~~~😁😁。this

以上只是介紹了6.0版本設置動態權限提醒的基本用法,當要一下申請好多個權限的時候,得想一想怎麼修改這些邏輯了,

相關文章
相關標籤/搜索