Android 11 存储权限适配指南
生活随笔
收集整理的這篇文章主要介紹了
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 存储权限适配指南的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 函数的渐进增长
- 下一篇: android sina oauth2.