Android App-targetSDKVersion28升级为30
为什么要修改targetSDKVersion?
1、应用开发平台要求(小米)
2、更好的兼容新版本的手机
有targetSDKVersion的位置:
- App的targetSDKVersion
- Module中的targetSDKVersion
- 引入的第三方库中有targetSDKVersion
修改了App和Module中的targetSDKVersion。
存储权限和存储位置问题
修改原因:
Android10(targetSdkVersion29)以后加入了分区存储,针对App设置了外置私有存储空间,卸载App时会被删除,一定程度上解决了卸载App后外置内存仍占用问题。
Android10在获取存储权限上和之前版本有区别。
修改前:
- targetSDKVersion28
- 使用EasyPermission框架获取权限。(长时间不更新且不支持新版本Android)
- 视频、音频、文件存储在外置存储卡【Environment.getExternalStorageDirectory()】中。
修改后:
- targetSDKVersion30(Android 11)
- 使用Permission替换EasyPermission获取权限
- 视频、音频、文件存储存储在私有外置存储中【context.getExternalFilesDir()】。
修改内容:
- 兼容Android不同版本获取权限。
- App新版本要处理老版本存储在外置存储卡中的内容。
知识点:
使用创建、读写文件测试对Environment.getExternalStorageDirectory()和context.getExternalFilesDir()目录的使用。
Environment.getExternalStorageDirectory()
(图片来源网络,侵删)- Android13:同Android11
- Android11:
- 动态获取Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE权限后创建读写文件时显示permission denied。
- 动态获取Manifest.permission.MANAGE_EXTERNAL_STORAGE权限后可以创建并读写文件,获取权限方式是通过Intent intent = Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION)跳转至设置页面,用户自行打开允许访问所有文件权限看后才可创建读写文件。
- Android10:同Android11
- Android9 动态获取Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE权限后可以创建并读写文件。
- Android6:动态获取Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE权限后可以创建并读写文件。
- Android5:不用获取权限可以创建并读写文件。
context.getExternalFilesDir();
- Android13:不用获取权限可以创建并读写文件。
- Android11:不用获取权限可以创建并读写文件。
- Android10:不用获取权限可以创建并读写文件。
- Android9:不用获取权限可以创建并读写文件。
- Android6:不用获取权限可以创建并读写文件。
- Android5:不用获取权限可以创建并读写文件。
修改方案:
(图片来源网络,侵删)- 修改视频、音频和文件存储位置为外置私有存储空间且不需要获取权限。
- 为兼容App旧版本存储在外置存储卡中的视频、音频和文件,在读取外置存储卡中的视频、音频和文件时需获取存储权限。
读取相册照片和视频
修改原因:
(图片来源网络,侵删)- Android10之后读取相册的权限不同且方法也不同。
修改前:
- 使用RxGalleryFinal框架(长时间不更新且不适配新版本Android)
修改后:
- 使用PictureSelector框架(适配Android10以后版本-内置有获取权限功能)
保存图片至相册
修改原因:
- Android10 添加至相册方式和位置不同。
修改后:
- 兼容不同Android版本
处理方法:
- Android9及之前版本,将图片保存至外置存储卡,然后通知将其添加到相册数据库,并刷新即可(需存储权限)。
- Android10及以后版本,不能将图片放置在私有外置存储空间(ContentResolver不支持,会提示错误),将图片放在公共媒体存放位置,然后刷新,使用ContentResolver实现。
实现代码如下:
package com.ypkj.kfpt.http; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Build; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.provider.MediaStore; import android.text.TextUtils; import android.text.format.DateUtils; import android.util.Log; import android.widget.Toast; import androidx.fragment.app.FragmentActivity; import com.learn.base.permission.PermissionsUtil; import com.ypkj.kfpt.R; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.util.UUID; /** * 下载图片至相册的工具类 */ public class DonwloadSaveImg { private static Context context; private static String filePath; private static Bitmap mBitmap; private static String mSaveMessage = "失败"; private final static String TAG = "PictureActivity"; public static void donwloadImg( Context contexts, String filePaths) { context = contexts; filePath = filePaths; PermissionsUtil.getInstance().requestStoragePerm((FragmentActivity) contexts, "", new PermissionsUtil.BaseRequestCallback() { @Override public void onCallBack() { new Thread(saveFileRunnable).start(); } }); } private static Runnable saveFileRunnable = new Runnable() { @Override public void run() { try { if (!TextUtils.isEmpty(filePath)) { //网络图片 // 对资源链接 URL url = new URL(filePath); //打开输入流 InputStream inputStream = url.openStream(); //对网上资源进行下载转换位图图片 mBitmap = BitmapFactory.decodeStream(inputStream); inputStream.close(); } saveBitmap(context, mBitmap); mSaveMessage = "图片保存成功!"; } catch (IOException e) { mSaveMessage = "图片保存失败!"; e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } messageHandler.sendMessage(messageHandler.obtainMessage()); } }; private static Handler messageHandler = new Handler() { @Override public void handleMessage(Message msg) { Log.d(TAG, mSaveMessage); Toast.makeText(context, mSaveMessage, Toast.LENGTH_SHORT).show(); } }; // 保存bitmap到相册,并兼容AndroidQ public static boolean saveBitmap(Context context, Bitmap bitmap) { if (bitmap == null) { return false; } boolean isSaveSuccess; if (Build.VERSION.SDK_INT = Build.VERSION_CODES.R) { resolver.delete(uri, null); } return false; } return true; } public static String getBitmapFileDir() { String BITMAP_FILE_DIRECTORY = context.getString(R.string.appname); if (Build.VERSION.SDK_INT
参考文档:
- 一篇文章搞定《Android权限问题(全版本)》https://blog.csdn.net/weixin_45112340/article/details/128905213
- [ ]应用TargetSdkVersion 30升级适配指南 https://dev.mi.com/distribute/doc/details?pId=1738#_2
- 兼容不同Android版本
- Android10 添加至相册方式和位置不同。
- 使用PictureSelector框架(适配Android10以后版本-内置有获取权限功能)
- 使用RxGalleryFinal框架(长时间不更新且不适配新版本Android)
- Android10之后读取相册的权限不同且方法也不同。
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。