首先要在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" package="com.test.app"> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.CAMERA" /> ..... </manifest>
可以先檢查是否有權限
val permission = ActivityCompat.checkSelfPermission( context, Manifest.permission.WRITE_EXTERNAL_STORAGE ) == PackageManager.PERMISSION_GRANTED val cameraPermission = ActivityCompat.checkSelfPermission( context, Manifest.permission.CAMERA ) == PackageManager.PERMISSION_GRANTED if (permission && cameraPermission) { //有權限了 val file = File("路徑") if (!file.exists() || !file.isDirectory) { try { //創建好文件夾 為后面操作文件做准備 file.mkdirs() } catch (e: IOException) { } } }else{ //這里調用授權請求 }
授權請求
try { ActivityCompat.requestPermissions( activity,//fragment 中使用 requireActivity() activity 中使用this即可 arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE ,Manifest.permission.CAMERA ), 1 //requestCode 自己隨便定義一個數字即可 在回調的時候知道就行 ) } catch (e: Exception) { //防止出問題 不catch的話 部分情況下會閃退 (禁用權限后,再次請求的話會閃退,使用模擬器和榮耀10測試,其他機型不清楚) }
接下來是授權請求回調 (frgament 和 activity回調函數一樣)
override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<out String>, grantResults: IntArray ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (requestCode == 1) { val result = grantResults[0] == PackageManager.PERMISSION_GRANTED val result2 = grantResults[1] == PackageManager.PERMISSION_GRANTED if (result && result2) { //授權成功 }else{ Toast.makeText(context, "您取消了授權,如果您想要授權的話請到 設置-應用 找到\"測試\"應用手動授予相應權限", Toast.LENGTH_SHORT).show() } } }
判斷權限是否被拒絕過
val has = ActivityCompat.shouldShowRequestPermissionRationale(activity, permission)
//首次安裝app 未授權 has = false 這里就有點坑爹了,沒有授權需要去授權返回false很蒙蔽了
//拒絕后 has = true
//授權后 has = false 這里授權后不需要授權正常
//拒絕后不在提示 has = false 這里不能授權也正常
//感覺shouldShowRequestPermissionRationale好像沒啥用處,純粹出來打醬油的
//我們下面的分析 因為首次未授權返回false 所在在為false的情況下我們請求授權,一旦用戶拒絕后返回true 此時情況下
//我們不在讓用戶去授權,就是不在讓用戶有看見拒絕后不在提示的選項 ,而是直接讓用戶跳轉到app詳細設置頁,手動去授權
//has為true的情況下 不要在去請求權限了,可以使用彈框提示用戶自己去設置開啟權限
//否則再次彈出的話,會出現禁止后不再提示 當用戶點擊禁止后不再提示 就不會彈出請求框了
//再次判斷是否拒絕過 會返回true 所以我們需要在權限被用戶禁用一次后,就不再去請求權限
//而是使用彈框提示用戶 這樣用戶來使用該功能的時候,
//我們每次可以給一個提示,讓用戶自己手動選擇開啟權限