网址的二级域名,金华百度seo,网站建设方案案例,购物网站建设实战教程答案一、Bug简述
一个很普通的需求#xff0c;需要下载图片到本地#xff0c;我的三个测试机#xff08;荣耀Android10#xff0c;红米 11 和小米Android 13都没有问题#xff09;。
然后#xff0c;主角登场了#xff0c;测试的三星Android 13 死活拉不起存储权限弹窗。 …一、Bug简述
一个很普通的需求需要下载图片到本地我的三个测试机荣耀Android10红米 11 和小米Android 13都没有问题。
然后主角登场了测试的三星Android 13 死活拉不起存储权限弹窗。
想了下三星的系统可能和小米的系统做了些区别。于是就是看了下存储权限的版本更迭却是发现了些骚东西。
二、原因
很早以前一直都是在manifest申明这两个权限就可以了但是现在会有下面的警告
这便是错误的原因 可以得知在Android 13sdkversion为33的系统中已经被废弃了
但是如果你给Write和Read权限加上maxSdkVersion32他在1112上是没有问题的但是最新的App要求 target sdkversion必须是33了。
所以在此就必须做一个适配
Android 11 里将引入一个特别的权限叫做 MANAGE_EXTERNAL_STORAGE该权限将授权读写所有共享存储内容这也将同时包含非媒体类型的文件。但是获得这个权限的应用还是无法访问其他应用的应用专属目录 (app-specific directory)无论是外部存储还是内部存储。
那么为了兼容Android版本我就必须在Android11之前和之后分开做申请才会有用。
三、步骤
1).申明权限
manifest文件里 uses-permissionandroid:nameandroid.permission.MANAGE_EXTERNAL_STORAGEtools:ignoreScopedStorage / 2.权限的判断
判断是否已经获得权限 private fun checkPer(activity: PreViewActivity): Boolean {return if (Build.VERSION.SDK_INT 30) {EasyPermissions.hasPermissions(activity,android.Manifest.permission.MANAGE_EXTERNAL_STORAGE)} else {EasyPermissions.hasPermissions(activity,android.Manifest.permission.WRITE_EXTERNAL_STORAGE)}}
未获得权限申请权限
private fun aaa(activity: PreViewActivity, curImg: Int) {if (Build.VERSION.SDK_INT Build.VERSION_CODES.R) {val intent Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)intent.data Uri.parse(package: activity.packageName)activity.startActivityForResult(intent, 200)} else {val perm android.Manifest.permission.WRITE_EXTERNAL_STORAGEPaperThreeVariable.isToRequestPer trueEasyPermissions.requestPermissions(PermissionRequest.Builder(activity,200,perm).build())}}
权限申请回调 override fun onRequestPermissionsResult(requestCode: Int, permissions: ArrayString, grantResults: IntArray) {super.onRequestPermissionsResult(requestCode, permissions, grantResults)EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)}override fun onPermissionsGranted(requestCode: Int, perms: MutableListString) {AppInitUtils().saveFreshAppImageToGallery(this, curImg)PaperThreeVariable.isToRequestPer false}override fun onPermissionsDenied(requestCode: Int, perms: MutableListString) {PaperThreeVariable.isToRequestPer falseif (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {AppSettingsDialog.Builder(this).setRationale(This function requires storage permission to be enabled).setNegativeButton(No).setPositiveButton(Yes).build().show()}}
因为有时候用户会拒绝权限且永久弹窗所以为了方便我就用了EasyPermission这个库拒绝的情况下弹窗跳转系统权限设置页面去让用户选择开启权限。 这样就OK啦(至于我的小米为啥Android 13也能正常拉起我也不知道具体原因但是在Android Studio的历史链接设备中我发现它识别我的手机系统为Android 12真是百思不得其解)
本文参考了郭霖大神的一篇文章当时是想看下 Scoped Storage这个属性的内容接过发现了Android 11的变更。
Android 11新特性Scoped Storage又有了新花样
仅做个人工作总结内容肯定不够全面如有问题欢迎大佬指正
Android Permission 权限申请EasyPermission和其他三方库_安卓权限申请_岁月不待人的博客-CSDN博客
补充
因为 MANAGE_EXTERNAL_STORAGE该权限将授权读写所有共享存储内容所以在谷歌中属于敏感权限不容易通过如果只是想保存图片则可以通过下面的博客中的方法去保存
Android 保存图片并刷新相册无需权限-CSDN博客
Android Gilde获取网络图片显示保存路径并转化为bitmap-CSDN博客