這篇文章主要講解了“Android開發之permission動態權限如何獲取”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Android開發之permission動態權限如何獲取”吧!
說明
Android 6.0 (API 23) 之前應用的權限在安裝時全部授予,運行時應用不再需要詢問用戶。在 Android 6.0 或更高版本對權限進行了分類,對某些涉及到用戶隱私的權限可在運行時根據用戶的需要動態授予。這樣就不需要在安裝時被強迫同意某些權限。
設備系統是 Android 6.0 (API 23) 或更高版本,并且應用的 targetSdkVersion 是 23 或更高版本,則針對在 AndroidManifest.xml 中聲明的危險權限,在運行時還需要動態請求用戶授權
動態權限請求相關操作的API封裝在在android.support.v4包中,發起請求權限的Activity需要直接或間接繼承android.support.v4.app.FragmentActivity。
也可以在直接或間接繼承 android.support.v4.app.Fragment 的 Fragment 中發起權限請求。
package com.xiets.demoapp;
import android.Manifest;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;
/**
* 一鍵備份通訊錄
*
* @author xietansheng
*/
public class MainActivity extends AppCompatActivity {
private static final int MY_PERMISSION_REQUEST_CODE = 10000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/**
* 點擊按鈕,將通訊錄備份保存到外部存儲器備。
*
* 需要3個權限(都是危險權限):
* 1. 讀取通訊錄權限;
* 2. 讀取外部存儲器權限;
* 3. 寫入外部存儲器權限.
*/
public void click(View view) {
/**
* 第 1 步: 檢查是否有相應的權限,根據自己需求,進行添加相應的權限
*/
boolean isAllGranted = checkPermissionAllGranted(
new String[] {
Manifest.permission.READ_CONTACTS,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
}
);
// 如果這3個權限全都擁有, 則直接執行備份代碼
if (isAllGranted) {
doBackup();
return;
}
/**
* 第 2 步: 請求權限
*/
// 一次請求多個權限, 如果其他有權限是已經授予的將會自動忽略掉
ActivityCompat.requestPermissions(
this,
new String[] {
Manifest.permission.READ_CONTACTS,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
},
MY_PERMISSION_REQUEST_CODE
);
}
/**
* 檢查是否擁有指定的所有權限
*/
private boolean checkPermissionAllGranted(String[] permissions) {
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
// 只要有一個權限沒有被授予, 則直接返回 false
return false;
}
}
return true;
}
/**
* 第 3 步: 申請權限結果返回處理
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == MY_PERMISSION_REQUEST_CODE) {
boolean isAllGranted = true;
// 判斷是否所有的權限都已經授予了
for (int grant : grantResults) {
if (grant != PackageManager.PERMISSION_GRANTED) {
isAllGranted = false;
break;
}
}
if (isAllGranted) {
// 如果所有的權限都授予了, 則執行備份代碼
doBackup();
} else {
// 彈出對話框告訴用戶需要權限的原因, 并引導用戶去應用權限管理中手動打開權限按鈕
openAppDetails();
}
}
}
/**
* 第 4 步: 備份通訊錄操作
*/
private void doBackup() {
// 本文主旨是講解如果動態申請權限, 具體備份代碼不再展示, 就假裝備份一下
Toast.makeText(this, "正在備份通訊錄...", Toast.LENGTH_SHORT).show();
}
/**
* 打開 APP 的詳情設置
*/
private void openAppDetails() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("備份通訊錄需要訪問 “通訊錄” 和 “外部存儲器”,請到 “應用信息 -> 權限” 中授予!");
builder.setPositiveButton("去手動授權", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setData(Uri.parse("package:" + getPackageName()));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
startActivity(intent);
}
});
builder.setNegativeButton("取消", null);
builder.show();
}
}感謝各位的閱讀,以上就是“Android開發之permission動態權限如何獲取”的內容了,經過本文的學習后,相信大家對Android開發之permission動態權限如何獲取這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。