日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android 11 存储权限适配指南

發布時間:2023/12/14 Android 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android 11 存储权限适配指南 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

(1)Android權限分類

  • 普通權限:只需要在清單文件中注冊即可
  • 危險權限:需要在代碼中動態申請,以彈系統 Dialog 的形式進行請求
  • 特殊權限:需要在代碼中動態申請,以跳系統 Activity 的形式進行請求

而我們今天要講的主題,是關于存儲權限,在 Android 6.0 之后就變成了危險權限,而到了 Android 11 上面變成了特殊權限,而最明顯的區別是一個是通過 Dialog 展示給用戶看,另外一個是通過 Activity 展現給用戶看。

(A)6.0之后的危險權限界面


(B)Android 11?之后的特殊權限界面

(2)Android 10.0 以下存儲權限適配

(A)升級 targetSdkVersion

android defaultConfig {targetSdkVersion 23} }

(B)添加清單權限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

(C)代碼動態申請

public final class PermissionActivity extends AppCompatActivity {private static final int REQUEST_CODE = 1024;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestPermission();}private void requestPermission() {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {// 先判斷有沒有權限if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {writeFile();} else {ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);}} else {writeFile();}}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (requestCode == REQUEST_CODE) {if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {writeFile();} else {ToastUtils.show("存儲權限獲取失敗");}}}/*** 模擬文件寫入*/private void writeFile() {ToastUtils.show("寫入文件成功");} }

(D)需要注意的是,如果 targetSdkVersion >= 29 上,還需要在清單文件中加上

<applicationandroid:requestLegacyExternalStorage="true">

否則就算申請了存儲權限,在安卓 10.0 的設備上將無法正常讀寫外部存儲上的文件

(3)Android 11 及以上申請存儲權限

(A)升級 targetSdkVersion

android defaultConfig {targetSdkVersion 30} }

(B)添加清單權限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

(C)代碼動態申請

public final class PermissionActivity extends AppCompatActivity {private static final int REQUEST_CODE = 1024;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestPermission();}private void requestPermission() {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {// 先判斷有沒有權限if (Environment.isExternalStorageManager()) {writeFile();} else {Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);intent.setData(Uri.parse("package:" + context.getPackageName()));startActivityForResult(intent, REQUEST_CODE);}} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {// 先判斷有沒有權限if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {writeFile();} else {ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);}} else {writeFile();}}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (requestCode == REQUEST_CODE) {if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {writeFile();} else {ToastUtils.show("存儲權限獲取失敗");}}}@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == REQUEST_CODE && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {if (Environment.isExternalStorageManager()) {writeFile();} else {ToastUtils.show("存儲權限獲取失敗");}}}/*** 模擬文件寫入*/private void writeFile() {ToastUtils.show("寫入文件成功");} }

(4)使用三方Jar來簡單申請權限

XXPermissions.with(this)// 不適配 Android 11 可以這樣寫//.permission(Permission.Group.STORAGE)// 適配 Android 11 需要這樣寫,這里無需再寫 Permission.Group.STORAGE.permission(Permission.MANAGE_EXTERNAL_STORAGE).request(new OnPermissionCallback() {@Overridepublic void onGranted(List<String> permissions, boolean all) {if (all) {toast("獲取存儲權限成功");}}@Overridepublic void onDenied(List<String> permissions, boolean never) {if (never) {toast("被永久拒絕授權,請手動授予存儲權限");// 如果是被永久拒絕就跳轉到應用權限系統設置頁面XXPermissions.startPermissionActivity(MainActivity.this, permissions);} else {toast("獲取存儲權限失敗");}}});

總結

以上是生活随笔為你收集整理的Android 11 存储权限适配指南的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。