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版本設置動態權限提醒的基本用法,當要一下申請好多個權限的時候,得想一想怎麼修改這些邏輯了,