網站首頁 編程語言 正文
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();
?? ? ? ?}
?? ??
?? ?}
原文鏈接:https://blog.csdn.net/yinhe888675/article/details/120881544
相關推薦
- 2022-07-11 SpringBoot事件機制@EventListener的簡單使用
- 2022-08-26 go-micro開發RPC服務以及運行原理介紹_Golang
- 2022-12-01 Docker系列學習之Swarm?mode管理節點常用命令詳解_docker
- 2022-09-21 Mac安裝軟件時提示已損壞的完美解決方法_相關技巧
- 2022-10-31 ViewPager實現圖片切換效果_Android
- 2022-04-25 Golang將Map的鍵值對調的實現示例_Golang
- 2022-03-14 Linux磁盤格式化和掛載(linux服務器硬盤掛載步驟)
- 2022-01-05 實體類[notmapped]特殊 “The specified type member ‘‘ is
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支