Android 運行時權限

Android 6.0 及以后,如果你的應用需要用到一些危險權限,那么這些權限必須手動申請
具體危險權限有哪些,可以通過下面這篇文章自行查詢到:
使用 adb 命令列出設備所有危險權限

例如,讀寫文件就涉及到兩個危險權限:
android.permission.READ_EXTERNAL_STORAGE
android.permission.WRITE_EXTERNAL_STORAGE

步驟1:聲明權限

首先,你必須在 AndroidManifest.xml 文件中聲明要用到的權限:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"><!-- 讀寫文件 --><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /></manifest>

對于危險權限來說,聲明了并不意味著你就擁有這些權限,你還必須手動申請。

步驟2:查詢是否有權限

在讀寫文件之前,你必須檢查你是否擁有讀寫文件的權限。
通過 ContextCompatcheckSelfPermission 函數就可以檢查是否擁有指定權限。

例如:

ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)

第一個參數是 Context
第二個參數是需要檢查的權限名稱。
該函數返回一個 Int 類型的值,其結果只有兩種:PackageManager.PERMISSION_GRANTEDPackageManager.PERMISSION_DENIED

  • PERMISSION_GRANTED:有此權限
  • PERMISSION_DENIED:無此權限

綜上所述,我們可以通過判斷來處理相應的邏輯:

if (ContextCompat.checkSelfPermission(this,Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
) {Log.d(TAG, "有權限")
} else {Log.d(TAG, "無權限")
}

步驟3:申請權限

對于沒有的權限,你就必須手動去申請。
通過 ActivityCompatrequestPermissions 函數就可以手動申請權限。

例如:

ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), PERMISSION_REQUEST_CODE)

第一個參數是 Activity;
第二個參數是將要申請的權限放在一個數組里,可以同時申請多個權限;
第三個參數是申請碼,權限申請是一個異步操作,申請結果會通過onRequestPermissionsResult回調告訴你,通過比較requestCode來定位你申請的結果

結合 ContextCompat.checkSelfPermission 一起使用:

if (ContextCompat.checkSelfPermission(this,Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
) {Log.d(TAG, "有權限")
} else {Log.d(TAG, "無權限")ActivityCompat.requestPermissions(this,arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),PERMISSION_REQUEST_CODE)
}

步驟4:申請結果

權限申請是一個異步操作,申請結果以回調的方式告知你。
通過 onRequestPermissionsResult 回調函數可以得到申請結果。

例如:

override fun onRequestPermissionsResult(requestCode: Int,permissions: Array<out String>,grantResults: IntArray
) {super.onRequestPermissionsResult(requestCode, permissions, grantResults)when (requestCode) {PERMISSION_REQUEST_CODE -> {if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {Log.d(TAG, "權限申請成功")} else {Log.d(TAG, "權限申請失敗")}}}
}

綜合案例

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><androidx.appcompat.widget.AppCompatButtonandroid:id="@+id/main_btn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="申請權限"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout>

MainActivity

class MainActivity : AppCompatActivity() {private val TAG = "MainActivity"private val PERMISSION_REQUEST_CODE = 1override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)val button: AppCompatButton = findViewById(R.id.main_btn)button.setOnClickListener {requestPermission()}}private fun requestPermission() {if (ContextCompat.checkSelfPermission(this,Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {Log.d(TAG, "有權限")work()} else {Log.d(TAG, "無權限")ActivityCompat.requestPermissions(this,arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),PERMISSION_REQUEST_CODE)}}override fun onRequestPermissionsResult(requestCode: Int,permissions: Array<out String>,grantResults: IntArray) {super.onRequestPermissionsResult(requestCode, permissions, grantResults)when (requestCode) {PERMISSION_REQUEST_CODE -> {if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {Log.d(TAG, "權限申請成功")work()} else {Log.d(TAG, "權限申請失敗")}}}}private fun work() {Log.d(TAG, "工作")}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/16037.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/16037.shtml
英文地址,請注明出處:http://en.pswp.cn/web/16037.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Unity 中獲取調用者方法名

介紹 在 Unity 開發中&#xff0c;有時需要在代碼中獲取當前方法的調用者方法名&#xff0c;以便進行日志記錄、調試等操作。本教程將詳細介紹如何使用 C# 中的 StackTrace 類來實現這一功能&#xff0c;并將其封裝成一個便捷的工具類&#xff0c;以方便在項目中的任何地方…

ES的安裝以及配置+ik分詞

環境&#xff1a;windows10、ES&#xff08;8.13.3&#xff09;、Kibana&#xff08;8.13.3&#xff09;、Logstash&#xff08;8.13.3&#xff09;、ik&#xff08;8.13.3&#xff09; 1.下載安裝ES Download Elasticsearch | ElasticDownload Elasticsearch or the complet…

AI預測體彩排3采取888=3策略+和值012路一縮定乾坤測試5月26日預測第2彈

今天繼續基于8883的大底進行測試&#xff0c;昨天的預測已成功命中&#xff01;今天繼續測試&#xff0c;按照排三前面的規律&#xff0c;感覺要出對子了&#xff0c;所以本次預測不再殺對子&#xff0c;將采用殺一個和尾來代替。好了&#xff0c;直接上結果吧~ 首先&#xff0…

mongoengine,一個非常實用的 Python 庫!

更多Python學習內容&#xff1a;ipengtao.com 大家好&#xff0c;今天為大家分享一個超酷的 Python 庫 - mongoengine。 Github地址&#xff1a;https://github.com/MongoEngine/mongoengine 在現代應用程序開發中&#xff0c;NoSQL數據庫因其靈活性和高性能而廣受歡迎。MongoD…

軟件需求規范說明模板

每個軟件開發組織都會為自己的項目選用一個或多個標準的軟件需求規范說明模板。有許多軟件需求規范說明模板可以使用(例如ISO/IEC/IEEE2011;Robertson and Robertson2013)。如果你的組織要處理各種類型或規模的項目&#xff0c;例如新的大型系統開發或是對現有系統進行微調&…

concurrency 并行編程

Goroutine go語言的魅力所在&#xff0c;高并發。 線程是操作系統調度的一種執行路徑&#xff0c;用于在處理器執行我們在函數中編寫的代碼。一個進程從一個線程開始&#xff0c;即主線程&#xff0c;當該線程終止時&#xff0c;進程終止。這是因為主線程是應用程序的原點。然后…

紅黑樹封裝map和set

紅黑樹源代碼 我們將由下列的KV模型紅黑樹來模擬封裝STL庫中的map和set 注意&#xff1a;為了實現封裝map和set&#xff0c;我們需要對下列源碼進行優化。 #pragma once #include<iostream> using namespace std; //枚舉類型的顏色分類 enum Colour {RED,BLACK };//定…

【Python爬蟲】圖片驗證碼的處理

什么是圖片驗證碼&#xff1f; 驗證碼&#xff08;CAPTCHA&#xff09;是&#xff02;Completely Automated Public Turing test to tell Computers and HumansApart”&#xff08;全自動區分計算機和人類的圖靈測試&#xff09;的縮寫&#xff0c;是一種區分用戶是計算機還是人…

Markdown魔法手冊:解鎖高效寫作的新技能

邊使用邊更新0.0... 文章目錄 一、如何在Markdown中插入表情&#xff1f;二、文字樣式設置1.文本顏色設置2.文本字號設置3.文本字體設置4. 實戰演練5.黃色高亮 一、如何在Markdown中插入表情&#xff1f; 在Markdown中插入表情&#xff08;emoji&#xff09;的方法取決于你使用…

如何提升百度小程序的收錄?百度小程序如何做優化?

? 如何通過百度小程序獲得更多的自然流量&#xff1f;這是做百度小程序肯定要考慮的問題&#xff0c;做百度小程序的目的就是想借助百度生態&#xff0c;做相應的關鍵詞給自己的小程序引流&#xff0c;如何把流量給做起來呢&#xff0c;接下來我從不同的方面給大家進行分析講解…

最新ChatGpt Desktop for Mac 安裝使用教程

1. 下載地址 請點擊鏈接下載 ChatGPT Desktop for MacOS 2. 使用要求 MacOS 版本 14需要時M1芯片的&#xff0c;如果你是因特爾的暫時還還不行 就算下載了也會出現下面的異常 3. 獲取權限資格 目前 ChatGPT MacOS Desktop還不是全量開放的, 如果你沒有收到通知說明你還沒…

在 Dockerfile 中遇到了連接到 pypi.org 超時的問題

看起來你在 Dockerfile 中遇到了連接到 pypi.org 超時的問題。這可能是由于網絡連接問題導致的。你可以嘗試以下方法解決這個問題&#xff1a; 1. 更換鏡像源&#xff1a; 有時候 pypi.org 的訪問會受到地理位置或網絡環境的影響&#xff0c;你可以考慮使用國內的鏡像源來代…

Oracle的ROWID解析

目錄 一、ROWID基礎概念二、ROWID的類型三、ROWID的用途四、注意事項五、管理與監控 Oracle的ROWID是一個非常核心的概念&#xff0c;它代表了一行數據在數據庫中的物理位置標識。 一、ROWID基礎概念 唯一性與不變性&#xff1a;ROWID是每行數據的唯一標識符&#xff0c;它在行…

【Spark】調整hive表在HDFS存的每個文件的大小

配置參數&#xff1a; spark.hadoop.hive.exec.orc.default.stripe.size78643200 spark.hadoop.orc.stripe.size78643200 spark.hadoopRDD.targetBytesInPartition78643200 spark.hadoop.hive.exec.dynamic.partition.modenonstrict spark.sql.sources.partitionOverwriteMode…

ipa 覆蓋算法測試

相關文章 ipa 功能包測試 ipa 分區算法 ipa 分區算法總結&#xff0c;部分算法圖解 ipa 覆蓋算法分析&#xff08;一&#xff09; ipa 覆蓋算法分析&#xff08;二&#xff09; 測試 網上找的地圖&#xff1a; fig.1 測試地圖 opencv fig.2 opencv 顯示的覆蓋路徑 rviz fi…

6.定時器分時復用測量占空比

1.CUBEMAX配置 測量PA6&#xff0c;PA7輸出的占空比&#xff0c;只需要把主要的配置&#xff0c;配置為A6口就行&#xff0c;A7口黃色表示配置不正確&#xff0c;不用管。 2.軟件代碼 TIME.c中找到TIM3的初始化&#xff0c;在后面初始化A7口 void MX_TIM3_Init_PA7(void) {/*…

創新實訓2024.05.25日志:Web應用技術選型

我們的web應用使用python web的fastapi框架&#xff0c;通過uvicorn開啟web服務。 1. refs 官網文檔&#xff1a;FastAPI (tiangolo.com) github&#xff1a;https://github.com/tiangolo/fastapi 2. 環境配置 python:3.11 uvicorn:0.29.0 pip install "uvicorn[stan…

老外賣27刀每月的教程已經更新

用了兩天半的時間&#xff0c;邊學習&#xff0c;邊整理了一份老外的視頻教程&#xff0c;涉及Facebook&#xff0c;YouTube&#xff0c;tiktok等大的流量平臺&#xff0c;有案例&#xff0c;有分析&#xff0c;有如何做。 這個教程是老外講的&#xff0c;沒有什么玄乎的塑造價…

理解矩陣內積與矩陣乘法的區別及其應用

文章目錄 矩陣內積&#xff08;逐元素乘積&#xff09;矩陣內積的用途矩陣乘法&#xff08;矩陣積&#xff09;矩陣乘法的用途區別總結結論 在數據科學、機器學習、計算機圖形學和圖像處理等領域&#xff0c;矩陣運算是非常基礎且重要的操作。然而&#xff0c;矩陣內積和矩陣乘…