肇庆网站建设公司/中国新闻发布
Android沙盒机制
Android Q文件存储机制修改成了沙盒模式,应用只能访问自己沙盒下的文件和公共媒体文件
- 存储(也就是write)私有目录和公共媒体文件都不需要WRITE_EXTERNAL_STORAGE权限
- 读取(也就是read)私有目录不需要READ_EXTERNAL_STORAGE权限,读取公共媒体文件需要READ_EXTERNAL_STORAGE权限,也就是说只能访问。
1、私有目录(自己沙盒)
getExternalFilesDir(这是APP自身目录下的文件夹 (Android/data/包名/fils))
- APP 卸载在这里插入代码片后,数据会清除。
- APP 访问自己的 App-specific 目录时无需任何权限。
- 可以使用FileProvider分享使用自己私有目录的文件。
所以在沙盒化的Q系统下,私有目录下的文件会跟随APP卸载而删除。在其目录内部的文件操作和Q之前的版本一样,可以随意处理。
保存到APP的私有目录PICTURES下面
private void saveAppPrivateFils(Bitmap bitmap) {File file = new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), "刘亦菲2.jpg");BufferedOutputStream bos = null;try {bos = new BufferedOutputStream(new FileOutputStream(file));bitmap.compress(Bitmap.CompressFormat.JPEG, 80, bos);bos.flush();bos.close();Toast.makeText(MainActivity.this, "保存成功", Toast.LENGTH_SHORT).show();} catch (IOException e) {e.printStackTrace();Toast.makeText(MainActivity.this, "保存失败" + e.toString(), Toast.LENGTH_SHORT).show();}}
读取私有目录指定的path下的图片
Bitmap bitmap = BitmapFactory.decodeFile(path);获取图片
有时候filePath下的文件会很大所以我们通过宽高的比例来缩放图片
/*** 从文件路径中获取bitmap,根据比例inSampleSize,来缩放图片*/public static Bitmap getBitmapFromPath(String pathName, int newWidth, int newHeight) {BitmapFactory.Options opts = new BitmapFactory.Options();opts.inJustDecodeBounds = true;//设置为ture只获取图片大小BitmapFactory.decodeFile(pathName, opts);opts.inSampleSize = getInSampleSize(opts, newWidth, newHeight);//计算缩放率,缩放图片opts.inJustDecodeBounds = false;//至为falsereturn BitmapFactory.decodeFile(pathName, opts);}/*** 计算InSampleSize,大于1的整数时是缩小原图*/private static int getInSampleSize(BitmapFactory.Options opts, int newW, int newH) {int outWidth = opts.outWidth;int outHeight = opts.outHeight;if (outWidth > newW || outHeight > newH)return (int) Math.ceil(Math.max(outWidth * 1d / newW, outHeight * 1d / newH));return 1;}
2、公共媒体文件
公有目录包括Downloads、Documents、Pictures 、DCIM、Movies、Music、Ringtones等
相对应的地址为/storage/emulated/0/Downloads(Pictures)等
- 公共目录下的文件在 APP 卸载后,不会删除。
- APP 可以通过 SAF框架(System Access Framework)、MediaStore 接口访问其中的文件。
- 无法直接使用路径访问公共目录文件。
由于公共目录没有办法直接访问和处理文件,所以我们需要按照Android Q的新规则来进行文件的处理,要使用到ContentResolver 和MediaStore数据库和Cursor 来进行查询等,也就是说如果你的项目中照片存储的路径就是APP的私有目录那么就没必要去适配AndroidQ
保存到共享媒体文件夹中DCIM(相册)
private void saveAppDCIMFils(Bitmap bitmap) {Uri uri =null;ContentResolver contentResolver = getContentResolver();ContentValues contentValues =new ContentValues();contentValues.put(MediaStore.Images.Media.DISPLAY_NAME, "刘亦菲.jpg");contentValues.put(MediaStore.Images.Media.DESCRIPTION, "刘亦菲.jpg");//兼容Android Q和以下版本if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {//android Q中不再使用DATA字段,而用RELATIVE_PATH代替//RELATIVE_PATH是相对路径不是绝对路径//DCIM是系统文件夹,关于系统文件夹可以到系统自带的文件管理器中查看,不可以写没存在的名字contentValues.put(MediaStore.Images.Media.RELATIVE_PATH, "DCIM/MNMZ");//contentValues.put(MediaStore.Images.Media.RELATIVE_PATH, "Music/signImage");} else {contentValues.put(MediaStore.Images.Media.DATA, Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getPath());}contentValues.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");uri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);OutputStream outputStream =null;try {outputStream = getContentResolver().openOutputStream(uri);bitmap.compress(Bitmap.CompressFormat.JPEG, 80, outputStream);outputStream.flush();outputStream.close();Toast.makeText(MainActivity.this,"保存成功",Toast.LENGTH_SHORT).show();}catch (IOException e) {e.printStackTrace();Toast.makeText(MainActivity.this,"保存失败"+e.toString(),Toast.LENGTH_SHORT).show();}}
在指定的公共path下获取图片
在公共媒体不能直接通过path来获取文件只能操作文件的uri来操作,所以我们可以根据path转换成uri。
public static Uri getImageContentUri(Context context, String path) {Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,new String[] { MediaStore.Images.Media._ID }, MediaStore.Images.Media.DATA + "=? ",new String[] { path }, null);if (cursor != null && cursor.moveToFirst()) {int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID));Uri baseUri = Uri.parse("content://media/external/images/media");return Uri.withAppendedPath(baseUri, "" + id);} else {// 如果图片不在手机的共享图片数据库,就先把它插入。if (new File(path).exists()) {ContentValues values = new ContentValues();values.put(MediaStore.Images.Media.DATA, path);return context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);} else {return null;}}}
可以直接操作文件的uri,也可以转换成bitmap(通过getContentResolver().openFileDescriptor(uri,“r”)) "r"表示读,"w"表示写
public static Bitmap getBitmapFromUri(Context context, Uri uri) {try {ParcelFileDescriptor parcelFileDescriptor =context.getContentResolver().openFileDescriptor(uri, "r");FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();Bitmap image = BitmapFactory.decodeFileDescriptor(fileDescriptor);parcelFileDescriptor.close();return image;} catch (Exception e) {e.printStackTrace();}return null;}
参考文档
- Android Q存储机制-沙盒机制
- AOSP-应用沙盒
- Android沙盒机制使用探究
相关文章:

Android沙盒机制
Android沙盒机制 Android Q文件存储机制修改成了沙盒模式,应用只能访问自己沙盒下的文件和公共媒体文件 存储(也就是write)私有目录和公共媒体文件都不需要WRITE_EXTERNAL_STORAGE权限读取(也就是read)私有目录不需要…...

【C++】每日一题 290 单词规律
给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。 #include <string> #include <unordered_ma…...

CSS3 animation-direction 属性
CSS3 animation-direction 属性 定义和用法 animation-direction 属性定义是否循环交替反向播放动画。 **注意:**如果动画被设置为只播放一次,该属性将不起作用。 默认值:normal继承:否可动画化:否。请参阅 可动画…...

【mysql 5.7 没有ini 文件,手动添加配置文件】
在安装目录的根目录添加my.ini配置文件: 注意注释的内容, 其中server-id 在开启日志归档的时候,一定要配置, [mysql] # 设置mysql客户端默认字符集 default-character-setutf8[mysqld] #server id 一定要设置,否则无法…...

【Python】从零开始学习Python中的随机模块:实现验证码生成功能
欢迎来CILMY23的博客 本篇主题为 从零开始学习Python中的随机模块:实现验证码生成功能 个人主页:CILMY23-CSDN博客 个人专栏系列: Python | C语言 | 数据结构与算法 | C 感谢观看,支持的可以给个一键三连,点赞关注…...

游戏动画技术:从传统到深度学习
一、传统游戏动画技术简介 3D游戏动画的骨骼动画和蒙皮技术动画交互控制:状态机、动作融合和IK基于状态机的动画控制原理和问题 二、Motion Matching技术简介 传统状态机动画的缺陷Motion Matching的原理:根据角色状态自动匹配动画Dance Card动捕流程…...

Github 2024-04-12 开源项目日报 Top10
根据Github Trendings的统计,今日(2024-04-12统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目6TypeScript项目2Cuda项目1C++项目1C项目1HTML项目1Jupyter Notebook项目1JavaScript项目1Python - 100天从新手到大师 创建周期:22…...

若依下整合多个Redis
提前总结,因此项目已多处使用Redis1 故此我创建的Redis工厂只添加了Redis2并不影响Redis1。但如若还有Redis3、4、5可按照下述方法继续往Redis工厂里添加 下述代码添加到 RedisConfig import org.springframework.beans.factory.annotation.Autowired; import org…...

SRTP + RTCP + SCTP
SRTP(Secure Real-time Transport Protocol) 主要功能:SRTP 是 RTP 的一个扩展,提供额外的安全特性,如加密、完整性校验和认证。它旨在保护实时传输的音频和视频流不被窃听或篡改。加密传输:SRTP 使用强加密…...

每日一题 — 串联所有单词的子串
30. 串联所有单词的子串 - 力扣(LeetCode) 思路:因为words里面的每一个字符串的长度都是固定的,所以可以将题转换成字符在字符串中的所有异位词 设出哈希表定义left和right进窗口维护count判断出窗口维护count 代码: …...

Android studio顶部‘app‘红叉- Moudle ‘XX.app’ dosen’t exist in project
Android studio顶部app红叉- Moudle ‘XX.app’ dosen’t exist in project 1、现象: 运行老项目或者有时候替换项目中的部分代码,明明没有错但是Android studio就编译报错了。 1.1 Android studio顶部app红叉。 1.2 点击Build没有clear菜单࿰…...

软考证书有用吗?软考证书的含金量大吗?
一、以考代评 通过考试并获得相应级别计算机专业技术资格(水平)证书的人员,表明其已具备从事相应专业岗位工作的水平和能力,用人单位可根据《工程技术人员职务试行条例》有关规定和工作需要,从获得计算机专业技术资格…...

自动化测试原理,怎么理解?【UI自动化】
首先,UI自动化是一种通过自动化工具或框架模拟用户与用户界面交互的测试技术。在软件开发过程中,这种技术对于确保用户界面的正确性和稳定性起着至关重要的作用。 具体来说,UI自动化的原理主要基于以下三个核心环节: 界面定位&am…...

typedef,#define,asserr,exit函数,free函数
一.typedef的应用 1.给已定的变量类型起个别名 加不加typedef,类型不变 (加之前是个数组,加之后是数组类型; 加之前是个函数指针,加之后是函数指针类型;) struct _person {char name[20];in…...

Linux的重要命令(二)+了解Linux目录结构
目录 一.Linux的目录结构 二.查看文件内容命令 1.cat 命令 2.more 命令 3.less 命令 4.head 命令 5.tail 命令 6.拓展 head 和 tail 的其他用法 编辑 三.统计文件内容的命令-wc 编辑 四.检索和过滤文件内容的命令-grep 编辑 编辑 五.压缩命令 gzip 和 bz…...

nmap使用
常用语句 主机发现和端口扫描 主机发现 sudo nmap -sn 192.168.80.0/24或sudo arp-scan -larp-scan是Kali Linux自带的一款ARP扫描工具。轻量级扫描工具,用来扫描局域网的主机还是挺好用的,由于扫描的少,所以扫描速度比较快,可…...

简约风好看的个人主页源码
效果图 PC端 移动端 源代码 index.html <html lang"en"><head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content&quo…...

1113. 红与黑--Flood Fill 算法
目录 1113. 红与黑--Flood Fill 算法---宽搜(BFS)或DFS) 输入格式 输出格式 数据范围 输入样例: 输出样例: 思路: 1.BFS 思路: 2.DFS 思路 方法一:(BFS&#x…...

深入Java中间件:编程设计精粹
个人主页: 进朱者赤 阿里非典型程序员一枚 ,记录平平无奇程序员在大厂的打怪升级之路。 一起学习Java、大数据、数据结构算法(公众号同名) 引言 在Java中间件和框架里蕴藏着数不尽的编程设计精粹。这些设计不仅值得我们在日常编码…...

AUTOCAD输出或打印PDF文件时,如何将图形居中且布满图纸?
AUTOCAD输出或打印PDF文件时,如何将图形居中且布满图纸? 如下图所示,我们打开一份DWG格式的图纸文件,然后点击上方的“打印“图标, 如下图所示, 打印机/绘图仪这里选择“DWG To PDF“; 图纸尺寸:这里以普通的A4纸为例进行说明; 打印比例选择“布满图纸“; 打印偏移…...

unity socket udp 连接
使用此方法有助于udp在局域网内稳定的连接运行,已经过验证,为了保持彻底的稳定,可以考虑加入ping-pang进行网络处理,如果为了安全,请使用加密TCP 如果您要在大规,大项目的游戏中使用网络技术,建…...

【ensp】VLAN间通信的解决办法
目录 VLAN间通信简介 VLAN间通信的两种方式 借助三层设备路由器进行VLAN间的通信(也就是单臂路由) 在端口上创建子接口之后为什么需要开启arp广播,是因为他是子接口吗? 拓扑图 交换机配置 路由器配置 查看路由器配置 测试能否实现…...

接口测试框架搭建D22
整体架构和分层设计 run.py 运行测试用例,生成测试报告 test_cases/ 登录用例 注册用例 其他业务用例... data/ 测试数据 libs 第三方插件,比如HTMLTestRunnerNew config config.yaml 静态配置数据 config.py 动态配置数据 reports 测试报告…...

CASA模型教程
原文链接:CASA模型教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247600635&idx6&sna655a8de570edcaa435d6e917b66d9b3&chksmfa82081ccdf5810a33a778e8771bb116bde9e5a1f795daa4894e5b74de17b03ebe86d7cdcfe3&token1464653739&…...

算法思路-遥感语义分割与变化检测
遥感影像存在的问题 1.不同季节影像的差异 2. 影像云雾遮挡 3.影像由于传感器、地物反射、地物高度差等导致的畸变 抛开数据,目前语义分割任务面临的问题 1. 单一任务模型很难具有通用性 结合自然语言的大模型是否会是一个新的启发点 首先需要考虑根据影像我…...

动态规划专练( 231.打家劫舍Ⅱ)
231.打家劫舍Ⅱ 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间…...

K-means和逻辑回归
逻辑回归 一个事件的几率是该事件发生的概率/该事件不发生的概率:P/(1-P) 对数几率是:log(P/(1-P)) **考虑对输入x分类的模型:**log(P/(1-P))wx 则 Pexp(wx)/(exp(w*x)…...

3.2 iHRM人力资源 - 组织架构 - 编辑及删除
iHRM人力资源 - 组织架构 文章目录 iHRM人力资源 - 组织架构一、编辑功能1.1 表单弹层并数据回显1.2 编辑校验1.3 编辑 二、删除功能 一、编辑功能 编辑功能和新增功能用的组件其实是一个,结构几乎是一样的,其实是复用了组件,我们也省去了很…...

支付系统核心逻辑 — — 状态机(JavaGolang版本)
支付系统核心逻辑 — — 状态机 代码地址:https://github.com/ziyifast/ziyifast-code_instruction/tree/main/state_machine_demo 1 概念:FSM(有限状态机),模式之间转换 状态机,也叫有限状态机(…...

rest_framework_mongoengine实现后端的增删改查
rest_framework_mongoengine实现后端增删改查 一、增删改查 1. 继承ModelViewSet实现增删改查 父urls.py path("api/testapp/", include("apps.testapp.urls")), # 测试子urls.py # -*- coding: utf-8 -*- from django.urls import path from res…...