Android11文件存储

举报
帅次 发表于 2021/12/23 00:35:57 2021/12/23
【摘要】 因Android11谷歌禁止使用requestLegacyExternalStorage 。 故将存储方式分为两种方式来进行文件存储,代码如下:  package com.demo.demo.utils; import android.Manifest;import android.content.ContentResolv...

因Android11谷歌禁止使用requestLegacyExternalStorage 。
故将存储方式分为两种方式来进行文件存储,代码如下: 


  
  1. package com.demo.demo.utils;
  2. import android.Manifest;
  3. import android.content.ContentResolver;
  4. import android.content.ContentValues;
  5. import android.content.Context;
  6. import android.content.Intent;
  7. import android.content.pm.PackageManager;
  8. import android.graphics.Bitmap;
  9. import android.net.Uri;
  10. import android.os.Build;
  11. import android.os.Environment;
  12. import android.provider.MediaStore;
  13. import android.text.format.DateUtils;
  14. import java.io.File;
  15. import java.io.FileNotFoundException;
  16. import java.io.FileOutputStream;
  17. import java.io.IOException;
  18. import java.io.OutputStream;
  19. import androidx.core.content.ContextCompat;
  20. /**
  21. * 创建时间:2021/4/15
  22. * 功能描述:图片保存至本地
  23. */
  24. public class PictureStorageUtils {
  25. public static boolean isSaveImage(Context context, Bitmap bm, String account) {
  26. boolean isSave;
  27. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { //大于等于android 10
  28. isSave = saveImageQ(context, bm, account);
  29. } else {
  30. isSave = saveImage(context, bm, name);
  31. }
  32. return isSave;
  33. }
  34. //2021/4/15 功能描述:转换为jpg格式保存到本地后并获取本地图片并显示(Android10及以下版本适用的方法)
  35. public static boolean saveImage(Context context, Bitmap outB, String name) {
  36. String imgName = MStringUtils.isNullOrEmpty(name) ? MOtherUtils.getPictureStorageTime() : name;
  37. //File.separator就是文件路径
  38. String fileName = Environment.getExternalStorageDirectory() + File.separator + "DCIM"
  39. + File.separator + "demo" + File.separator;
  40. try {
  41. File file = new File(fileName);
  42. if (!file.exists()) {
  43. file.mkdirs();
  44. }
  45. MLog.e("saveAndGetImage:" + file);
  46. File filePath = new File(file + "/" + imgName + ".png");
  47. MLog.e("filePath:" + filePath);
  48. FileOutputStream out = new FileOutputStream(filePath); //保存到本地,格式为JPEG
  49. if (outB.compress(Bitmap.CompressFormat.PNG, 100, out)) {
  50. out.flush();
  51. out.close();
  52. }
  53. MLog.e("saveAndGetImage:END");
  54. //刷新图库
  55. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//高于22版本要手动授权
  56. // 检查该权限是否已经获取
  57. int i = ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE);
  58. // 权限是否已经 授权 GRANTED---授权 DINIED---拒绝
  59. if (i != PackageManager.PERMISSION_GRANTED) {
  60. // 提示用户应该去应用设置界面手动开启权限
  61. } else {
  62. context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(filePath)));
  63. }
  64. } else {
  65. context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(filePath)));
  66. }
  67. return true;
  68. } catch (FileNotFoundException e) {
  69. MLog.e("FileNotFoundException e.toString: " + e.toString());
  70. e.printStackTrace();
  71. return false;
  72. } catch (IOException e) {
  73. MLog.e("IOException e.toString: " + e.toString());
  74. e.printStackTrace();
  75. return false;
  76. }
  77. }
  78. //2021/4/15 功能描述:Android10及以上保存图片到相册
  79. public static boolean saveImageQ(Context context, Bitmap image, String name) {
  80. Long mImageTime = System.currentTimeMillis();
  81. String mImageFileName = MStringUtils.isNullOrEmpty(name) ? MOtherUtils.getPictureStorageTime() : name;
  82. final ContentValues values = new ContentValues();
  83. values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DCIM
  84. + File.separator + "demo"); //图库中显示的文件夹名。
  85. values.put(MediaStore.MediaColumns.DISPLAY_NAME, mImageFileName);
  86. values.put(MediaStore.MediaColumns.MIME_TYPE, "image/png");
  87. values.put(MediaStore.MediaColumns.DATE_ADDED, mImageTime / 1000);
  88. values.put(MediaStore.MediaColumns.DATE_MODIFIED, mImageTime / 1000);
  89. values.put(MediaStore.MediaColumns.DATE_EXPIRES, (mImageTime + DateUtils.DAY_IN_MILLIS) / 1000);
  90. values.put(MediaStore.MediaColumns.IS_PENDING, 1);
  91. ContentResolver resolver = context.getContentResolver();
  92. final Uri uri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
  93. try {
  94. // 写下我们截图的实际数据
  95. try (OutputStream out = resolver.openOutputStream(uri)) {
  96. if (!image.compress(Bitmap.CompressFormat.PNG, 100, out)) {
  97. throw new IOException("Failed to compress");
  98. }
  99. }
  100. // 一切都很顺利、
  101. values.clear();
  102. values.put(MediaStore.MediaColumns.IS_PENDING, 0);
  103. values.putNull(MediaStore.MediaColumns.DATE_EXPIRES);
  104. resolver.update(uri, values, null, null);
  105. return true;
  106. } catch (IOException e) {
  107. MLog.e(e.getMessage());
  108. return false;
  109. }
  110. }
  111. }

  
  1. 对ll_dialog进行截图:
  2. Bitmap bm = Bitmap.createBitmap(ll_dialog.getWidth(), ll_dialog.getHeight(),
  3. Bitmap.Config.ARGB_8888);
  4. Canvas canvas = new Canvas(bm);
  5. ll_dialog.draw(canvas);

调用
RichPictureStorageUtils.isSaveImage(Activity.this, bm,name);


  
  1. public static final String[] STANDARD_DIRECTORIES = {
  2. DIRECTORY_MUSIC,
  3. DIRECTORY_PODCASTS,
  4. DIRECTORY_RINGTONES,
  5. DIRECTORY_ALARMS,
  6. DIRECTORY_NOTIFICATIONS,
  7. DIRECTORY_PICTURES,
  8. DIRECTORY_MOVIES,
  9. DIRECTORY_DOWNLOADS,
  10. DIRECTORY_DCIM,
  11. DIRECTORY_DOCUMENTS,
  12. DIRECTORY_AUDIOBOOKS,
  13. };

文章来源: shuaici.blog.csdn.net,作者:帅次,版权归原作者所有,如需转载,请联系作者。

原文链接:shuaici.blog.csdn.net/article/details/116942978

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。