本文是 Android 11 从外部存储读取文件到应用沙盒存储   的兄弟篇 :Android 11 从沙盒拷贝文件到外部共享存储区域,效果:

1. 需求中我们需要把自己应用沙盒的文件拷贝到外部共享存储区域,提供给其他app使用

1)外部共享存储区域:主要是指Enviromnent下的 如

Environment.DIRECTORY_DCIM
Environment.DIRECTORY_DOCUMENTS
Environment.DIRECTORY_DOWNLOADS
Environment.DIRECTORY_MOVIES
Environment.DIRECTORY_PICTURES
Environment.DIRECTORY_MUSIC

等。

2)外部存储区域:指SDCard下任意路径。

在Android11以上已经不能随便访问任意外部存储路径了,并且也不能直接new File形式访问。(其实是在Android 10 谷歌就开始建议,但是没有强制。开发者可以通过在AndroidManifest.xml application节点中加上android:requestLegacyExternalStorage="true"属性还能继续访问外部存储)

2.  拷贝自己应用沙盒路径下文件到外部共享存储区域核心实现:

1)工具方法

 /*** 拷贝沙盒中的文件到外部存储区域* @param filePath 沙盒文件路径* @param  externalUri 外部存储文件的 uri*/public static boolean copySandFileToExternalUri(Context context, String filePath, Uri externalUri) {ContentResolver contentResolver = context.getContentResolver();InputStream inputStream = null;OutputStream outputStream = null;boolean ret = false;try {outputStream = contentResolver.openOutputStream(externalUri);File sandFile = new File(filePath);if(sandFile.exists()) {inputStream = new FileInputStream(sandFile);int readCount = 0;byte[] buffer = new byte[1024];while ((readCount = inputStream.read(buffer)) != -1) {outputStream.write(buffer, 0 , readCount);outputStream.flush();}}ret = true;} catch (Exception e) {Log.e(TAG, "copy SandFile To ExternalUri. e = " + e.toString());ret = false;} finally {try {if(outputStream != null) {outputStream.close();}if(inputStream != null) {inputStream.close();}Log.d(TAG, " input stream and output stream close successful.");} catch (Exception e) {e.printStackTrace();Log.e(TAG, " input stream and output stream close fail. e = " + e.toString());}return ret;}}

2) 调用例子

android 6.0以上需要动态申请权限,因此需要先进行权限判断:

已有权限走else case

                /*** android 6.0以上动态权限申请:写权限*/if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, FileHandlePresenter.PERMISSION_CODE_WRITE_EXTERNAL);} else {fileHandlePresenter.handleWriteExternalStorage();}

权限申请回调

public void onRequestPermissionsResult(int requestCode, @NonNull @NotNull String[] permissions, @NonNull @NotNull int[] grantResults) {......} else if(requestCode == PERMISSION_CODE_WRITE_EXTERNAL) {if(grantResults[0] == PackageManager.PERMISSION_GRANTED) {handleWriteExternalStorage();}} ......
}

获得权限后拷贝文件操作:

    /***   将沙盒中的文件/data/data/包名/cache/test.txt 保存到外部存储区域 sdcard/test.txt*/public void handleWriteExternalStorage() {File sandFile = new File(mFragment.getActivity().getCacheDir() + File.separator + "test.txt");if(!sandFile.exists()) {Toast.makeText(mFragment.getActivity(), "请先手动创建test.txt 并且保存到/data/data/包名/cache/下", Toast.LENGTH_LONG).show();return;}ThreadManager.getInstence().postTask(new Runnable() {@Overridepublic void run() {Uri externalUri = null;if(Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {File externalFile = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);File destFile = new File(externalFile + File.separator + "test.txt");externalUri = Uri.fromFile(destFile);} else {ContentResolver resolver = mFragment.getActivity().getContentResolver();ContentValues values = new ContentValues();values.put(MediaStore.Downloads.DISPLAY_NAME, "test.txt");values.put(MediaStore.Downloads.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS);//保存路径Uri uri = MediaStore.Files.getContentUri("external");externalUri = resolver.insert(uri, values);}boolean ret = FileHelper.copySandFileToExternalUri(mFragment.getActivity(), sandFile.getAbsolutePath(), externalUri);mFragment.getActivity().runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(mFragment.getActivity(), "从沙盒" + sandFile.getAbsolutePath() + "中拷贝文件到外部存储"+ Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath()+ ", 结果= " + ret, Toast.LENGTH_LONG).show();}});}});}

Demo地址:

https://github.com/mikelhm/MikelProjectDemo

Android 11 从沙盒拷贝文件到外部共享存储区域相关推荐

  1. 计算沙盒下文件夹内容大小 清空沙盒 文件 目录

    1 +(float)fileSizeForDir:(NSString*)path//计算文件夹下文件的总大小 2 3 { 4 5 NSFileManager *fileManager = [[NSFi ...

  2. ios 运行android应用程序,iOS与Android应用程序沙盒机制的研究与总结

    简介 复杂系统始终存在漏洞, 软件复杂性只会随着时间的推移而增加.无论您如何谨慎地采用安全编码实践并防范错误, 攻击者只需通过一次防御即可成功.虽然应用沙盒不能防止对你的应用的攻击, 但它确实最大限度 ...

  3. 【Google Play】APK 扩展包 ( 2021年09月 最新处理方案 | 文件准备 | 拷贝文件至内置存储 | 解压及使用扩展文件 )

    文章目录 前言 一.文件准备 二.拷贝文件至内置存储 三.解压及使用扩展文件 四.博客资源 前言 在上一篇博客 [Google Play]APK 扩展包 ( 2021年09月02日最新处理方案 | 内 ...

  4. iOS 开发之沙盒机制 文件操作 (NSFielManager)

    原文链接:http://www.jianshu.com/p/349855b5a8ae iOS APP 可以在自己的沙盒里读写文件,但是,不可以访问其他 APP 的沙盒.每一个 APP 都是一个信息孤岛 ...

  5. Android的隐私沙盒,与iOS隐私政策有哪些不同?

    近年来,全球掀起个人信息与隐私的热潮.欧盟 2018 年实施 GDPR,美国 2020 年实施 CCPA,中国2021年实施<个人信息保护法>,这些法规均对企业处理用户的数据提出了具体的约 ...

  6. Android 推出隐私沙盒

    作者 / Anthony Chavez,Android 安全与隐私产品管理副总裁 移动应用程序是我们日常生活的核心部分.目前,Google Play 上超过 90% 的应用程序是免费的,让数十亿用户得 ...

  7. ios 沙盒 plist 数据的读取和存储

    plist 只能存储基本的数据类型 和 array  字典 [objc] view plaincopy - (void)saveArray { // 1.获得沙盒根路径 NSString *home  ...

  8. Android 11.0 蓝牙去掉传输文件的功能

    1.概述 在11.0的系统产品开发中,对于蓝牙的管控也是常有的功能,比如禁止连接蓝牙,禁止蓝牙传输文件等功能,最近有产品功能需求,要求禁止蓝牙传输文件,这就要从蓝牙文件传输流程分析,然后禁用传输功能就 ...

  9. iOS App查看Log:通过iTunes获取真机沙盒中文件

    1.Win电脑下载iTunes应用 2.打开iTunes应用,如下是默认页面 3.用数据线将ios手机与win电脑连接,转为如下页面 4.点击如下按钮 5.点击文件共享,选择测试的App,文档储存在右 ...

最新文章

  1. “神人”or“闲人”?你的未来由AI与大数据决定
  2. SAP HU上面的'Obj.to Which HU Belongs'栏位初探
  3. 使用 vue.js 的一些操作记录
  4. Facebook全球宕机近7小时,传有15亿用户数据泄漏,市值蒸发千亿
  5. SAP修改数据表(tables)的方法
  6. 华为服务器忘记管理密码怎么修改,忘记云服务器密码怎么修改
  7. 《Windows via C/C++》学习笔记 —— “线程同步”之“检测死锁”
  8. 软考信息安全工程师学习笔记三(1.3 信息安全管理基础)
  9. 北大OJ(POJ 2808)校门外的树
  10. 微信iOS版内测暗黑模式;涉嫌恶意举报,社交平台Soul运营合伙人被批捕;AWS推出基于Linux开源操作系统 | 极客头条...
  11. java第三方登录接口_第三方登录接入-qq,weibo-java
  12. git常用命令(史上最经典)
  13. java excel 2007兼容包_excel2007兼容包
  14. 漫谈程序员系列:群星闪耀的黄金时代
  15. iOS系统3DTouch全解析
  16. 使用GridView使用类似电影海报宣传页面
  17. 这些两轮电动车的黑科技你知道吗?
  18. 基于Paddlehub实现的秒换证件照底色
  19. docker磁盘空间满了怎么清理
  20. #Java实例(一)

热门文章

  1. 【Pandas 笔试测试题】
  2. 防火墙使用回环地址lookback建立ipsec隧道
  3. 正待等待暴雪服务器响应,暴雪玩乌龙,TBC怀旧服B测服务器未部署,或将增设跃迁兽坐骑...
  4. 福一中招聘计算机教师,北京市第一七一中学2019年招聘教师人员岗位表(第一批)...
  5. 泉州师范学院计算机课程表,泉州师范学院软学院 2010 级第 四 学期课程表.doc
  6. 西方经济学 微观部分 第六版 高鸿业 编 中国人民大学出版社 大学课后习题答案
  7. EDA软件_Cadence_Allegro 16.6导入网络表出错分析
  8. 学习openstack(五)
  9. 易语言大漠多线程foobar在游戏多窗口中时时显示输出信息
  10. Colibri for Mac(mac无损音乐播放器)