概述
如果是android6.0以下的版本,只需要在manifest聲明對應(yīng)的權(quán)限即可。但是這樣會大大降低系統(tǒng)的安全性。所以在android6.0及其以后,app獲取權(quán)限需要得到用戶的反饋才可以。
動態(tài)獲取權(quán)限
動態(tài)獲取權(quán)限,可以分為兩種情況。情況一,操作到app特定的功能,需要某些權(quán)限時進行動態(tài)獲取,這種情況即為“懶漢式”獲取。情況二,在初始情況時(在onCreate中獲?。?,直接獲取到所有需要的權(quán)限,這種情況即為“餓漢式”。
具體實現(xiàn)
比如某個app在使用的時候需要獲取到到通訊錄的讀寫權(quán)限,短信的讀取發(fā)送權(quán)限。
注意:讀通訊錄是一個權(quán)限,寫通訊錄是一個權(quán)限。這是兩個權(quán)限。
短信的讀取是一個權(quán)限,短信的發(fā)送是操作短信的另一個權(quán)限。
layout布局代碼
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center_horizontal"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn_contact"
android:text="獲取通訊錄的讀寫權(quán)限"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn_sms"
android:text="獲取短信的查看發(fā)送權(quán)限"/>
</LinearLayout>
獲取通訊錄的讀寫權(quán)限按鈕的id是:btn_contact
獲取短信的查看發(fā)送權(quán)限按鈕的id是:btn_sms
回調(diào)函數(shù)onRequestPermissionsResult
該回調(diào)函數(shù)會在用戶點擊完動態(tài)獲取權(quán)限的彈窗后執(zhí)行。當彈出動態(tài)獲取權(quán)限的窗口后,用戶在該窗口進行選擇“允許”或“不允許”,當選擇完后,即可在該回調(diào)函數(shù)中進行相應(yīng)的判斷,判斷用戶是否允許了權(quán)限。
該函數(shù)在MainActivity類中
//點擊申請權(quán)限彈框后的回調(diào)函數(shù)
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
權(quán)限判斷工具類
public class PermissionUtil {
//檢查某個功能的多個權(quán)限,返回true表示已完全啟用權(quán)限,返回false表示未完全啟用權(quán)限
//比如通訊錄這個功能,需要獲取它有的多個權(quán)限[讀權(quán)限,寫權(quán)限]
//act:當前的Activity
//permissions:某個功能的權(quán)限集合,如通訊錄的[讀,寫]
//requestCode:標識一下“某個功能”
public static boolean checkPermission(Activity act, String[] permissions, int requestCode){
//判斷android的版本
//Build.VERSION.SDK_INT:當前android的版本
//Build.VERSION_CODES.M:android6.0
if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){//安卓版本在6.0及以后才需要判斷 M就是6.0
//check的含義:權(quán)限是否開啟
//這里給了默認值PackageManager.PERMISSION_GRANTED,意思是開啟權(quán)限
int check = PackageManager.PERMISSION_GRANTED;//默認授權(quán)的值
for (String permission:permissions){
//返回結(jié)果為是否授權(quán)
check = ContextCompat.checkSelfPermission(act, permission);
//如果沒有授權(quán),則退出
if (check!=PackageManager.PERMISSION_GRANTED){
break;
}
}
//未開啟該權(quán)限,則請求系統(tǒng)彈窗,好讓用戶選擇是否立即開啟權(quán)限
if (check!=PackageManager.PERMISSION_GRANTED){
//彈窗,用戶操作
ActivityCompat.requestPermissions(act,permissions,requestCode);
return false;
}
}
return true;
}
//grantResults:是用戶點“授權(quán)”完彈窗后的授權(quán)結(jié)果數(shù)組
//檢查權(quán)限結(jié)果數(shù)組,返回true表示都已經(jīng)獲得授權(quán)。返回false表示至少有一個未獲得授權(quán)
public static boolean checkGrant(int[] grantResults) {
if (grantResults!=null){
//遍歷權(quán)限結(jié)果數(shù)組中的每條選擇結(jié)果
for (int grant:grantResults){
//未獲得授權(quán)
if (grant!=PackageManager.PERMISSION_GRANTED){
return false;
}
}
return true;
}
return false;
}
}
清單文件
聲明權(quán)限權(quán)限(必須聲明)
<!-- 聲明讀寫通訊錄權(quán)限-->
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<!--聲明讀發(fā)短信權(quán)限-->
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
方式一:懶漢式
上面說過,懶漢式,是在app操作到特定功能時從獲取相應(yīng)權(quán)限,在這里的“特定功能”就是在點擊按鈕時,動態(tài)獲取權(quán)限。
定義權(quán)限數(shù)組
//通信錄的讀寫權(quán)限
private static final String[] PERMISSIONS_CONTACTS=new String[]{
Manifest.permission.READ_CONTACTS,//讀通訊錄
Manifest.permission.WRITE_CONTACTS//寫通訊錄
};
//短信的發(fā)送、讀取權(quán)限
private static final String[] PERMISSIONS_SMS=new String[]{
Manifest.permission.SEND_SMS,//發(fā)送短信
Manifest.permission.READ_SMS//讀取短信
};
標識碼
//標識通訊錄
private static final int REQUEST_CODE_CONTACTS=1;
//標識短信
private static final int REQUEST_CODE_SMS=2;
點擊事件監(jiān)聽
實現(xiàn)View.OnClickListener,并實現(xiàn)onClick方法
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btn_contact:
PermissionUtil.checkPermission(this,PERMISSIONS_CONTACTS,REQUEST_CODE_CONTACTS);
break;
case R.id.btn_sms:
PermissionUtil.checkPermission(this,PERMISSIONS_CONTACTS,REQUEST_CODE_SMS);
break;
}
}
我們可以看到,如果沒有授權(quán)就會執(zhí)行到工具類PermissionUtil中的如下語句:
ActivityCompat.requestPermissions(act,permissions,requestCode);
它會出現(xiàn)彈窗,給用戶選擇是否獲取所有權(quán)限
用戶選擇完后就會回調(diào)Activity中的,所以我們可以在該函數(shù)中進行是否授權(quán)的判斷
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
MainActivity完整代碼
package com.example.demo8;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.Manifest;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
import com.example.demo8.util.PermissionUtil;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
//通信錄的讀寫權(quán)限
private static final String[] PERMISSIONS_CONTACTS=new String[]{
Manifest.permission.READ_CONTACTS,
Manifest.permission.WRITE_CONTACTS
};
//短信的發(fā)送、讀取權(quán)限
private static final String[] PERMISSIONS_SMS=new String[]{
Manifest.permission.SEND_SMS,
Manifest.permission.READ_SMS
};
//標識通訊錄
private static final int REQUEST_CODE_CONTACTS=1;
//標識短信
private static final int REQUEST_CODE_SMS=2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//設(shè)置監(jiān)聽事件
findViewById(R.id.btn_contact).setOnClickListener(this);
findViewById(R.id.btn_sms).setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btn_contact:
//上下文、權(quán)限數(shù)組、標識
PermissionUtil.checkPermission(this,PERMISSIONS_CONTACTS,REQUEST_CODE_CONTACTS);
break;
case R.id.btn_sms:
PermissionUtil.checkPermission(this,PERMISSIONS_SMS,REQUEST_CODE_SMS);
break;
}
}
//點擊申請權(quán)限彈框后的回調(diào)函數(shù)
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode){
case REQUEST_CODE_CONTACTS:
if (PermissionUtil.checkGrant(grantResults)){
Toast.makeText(this, "通訊錄權(quán)限獲取成功", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this, "獲取通訊錄讀寫權(quán)限獲取失敗", Toast.LENGTH_SHORT).show();
}
break;
case REQUEST_CODE_SMS:
if (PermissionUtil.checkGrant(grantResults)){
Toast.makeText(this, "收發(fā)短信權(quán)限獲取成功", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this, "收發(fā)短信權(quán)限獲取失敗", Toast.LENGTH_SHORT).show();
}
break;
}
}
}
方式二:餓漢式
餓漢式,是在“onCreate”的時候就進行權(quán)限的申請,一次性到位。
我們將所有需要申請的權(quán)限放到一個數(shù)組中
//將權(quán)限放到一個數(shù)組中
private static final String[] PERMISSIONS=new String[]{
//通信錄的讀寫權(quán)限
Manifest.permission.READ_CONTACTS,
Manifest.permission.WRITE_CONTACTS,
//短信的發(fā)送、讀取權(quán)限
Manifest.permission.SEND_SMS,
Manifest.permission.READ_SMS
};
在oncreate中進行權(quán)限的申請
其余原理與懶漢式相同,只是申請權(quán)限的時間不同而已。文章來源:http://www.zghlxwxcb.cn/news/detail-669297.html
通訊錄
短信
MainActivity代碼文章來源地址http://www.zghlxwxcb.cn/news/detail-669297.html
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
//將權(quán)限放到一個數(shù)組中
private static final String[] PERMISSIONS=new String[]{
//通信錄的讀寫權(quán)限
Manifest.permission.READ_CONTACTS,
Manifest.permission.WRITE_CONTACTS,
//短信的發(fā)送、讀取權(quán)限
Manifest.permission.SEND_SMS,
Manifest.permission.READ_SMS
};
private static final int REQUEST_CODE=1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/初始獲取權(quán)限
PermissionUtil.checkPermission(this,PERMISSIONS,REQUEST_CODE);
//設(shè)置監(jiān)聽事件
findViewById(R.id.btn_contact).setOnClickListener(this);
findViewById(R.id.btn_sms).setOnClickListener(this);
}
//餓漢式這里無用
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btn_contact:
break;
case R.id.btn_sms:
break;
}
}
//點擊申請權(quán)限彈框后的回調(diào)函數(shù)
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode){
case REQUEST_CODE:
if (PermissionUtil.checkGrant(grantResults)){
Toast.makeText(this, "權(quán)限獲取成功", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this, "權(quán)限獲取失敗", Toast.LENGTH_SHORT).show();
}
break;
}
}
}
到了這里,關(guān)于Android動態(tài)獲取權(quán)限(詳細教程附代碼)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!