【代码】Android|获取存储权限并创建、存储文件
版本:Android 11及以上,gradle 7.0以上,Android SDK > 29
获取存储权限
获取存储权限参考:Android 11 外部存储权限适配指南及方案,这篇文章直接翻到最下面,用XXPermissions框架。它漏了这个框架的使用方式,使用方式参考https://github.com/getActivity/XXPermissions。
在任意能够执行的地方添加以下代码:
XXPermissions.with(this)// 不适配 Android 11 可以这样写//.permission(Permission.Group.STORAGE)// 适配 Android 11 需要这样写,这里无需再写 Permission.Group.STORAGE.permission(Permission.MANAGE_EXTERNAL_STORAGE).request(new OnPermissionCallback() {@Overridepublic void onGranted(List<String> permissions, boolean all) {if (all) {Toast.makeText(MainActivity.this, "获取存储权限成功", Toast.LENGTH_SHORT).show();}}@Overridepublic void onDenied(List<String> permissions, boolean never) {if (never) {Toast.makeText(MainActivity.this, "永久获取存储权限失败", Toast.LENGTH_SHORT).show();// 如果是被永久拒绝就跳转到应用权限系统设置页面XXPermissions.startPermissionActivity(MainActivity.this, permissions);} else {Toast.makeText(MainActivity.this, "获取存储权限失败", Toast.LENGTH_SHORT).show();}}});
它的import内容是:
import com.hjq.permissions.OnPermissionCallback;
import com.hjq.permissions.Permission;
import com.hjq.permissions.XXPermissions;
import com.hjq.permissions.PermissionFragment;
然后根据github的README的“集成步骤”,引入库:
- 在
settings.gradle文件中加入
dependencyResolutionManagement {repositories {// JitPack 远程仓库:https://jitpack.iomaven { url 'https://jitpack.io' }}
}
- 配置完远程仓库后,在项目 app 模块下的
build.gradle文件中加入远程依赖
android {// 支持 JDK 1.8 及以上compileOptions {targetCompatibility JavaVersion.VERSION_1_8sourceCompatibility JavaVersion.VERSION_1_8}
}dependencies {// 权限请求框架:https://github.com/getActivity/XXPermissionsimplementation 'com.github.getActivity:XXPermissions:18.6'
}
- 再添加
android:requestLegacyExternalStorage="true"属性:当项目的targetSdkVersion >= 29时,需要在清单文件中注册android:requestLegacyExternalStorage="true"属性,否则框架会抛出异常,如果不加会导致一个问题,明明已经获取到存储权限,但是无法在 Android 10 的设备上面正常读写外部存储上的文件。
创建、存储文件
首先是需要知道应该保存到哪里,
查路径的API参考文章Android 保存文件路径方法,
然后是需要创建目录和文件,并存储。
存储的过程参考文章保存File文件到本地,
例如存储到外部路径的代码:
String createDir(String dirName) {// 在sd卡根目录创建一个文件夹String absolutePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + dirName;File dir = new File(absolutePath);if (!dir.exists()) {dir.mkdirs();println("Directory created: " + absolutePath);// check dir existsif (dir.exists()) {println("Directory exists: " + absolutePath);}return absolutePath;}println("Directory already exists: " + absolutePath);return absolutePath;}void saveIndex(String dirpath, int bgIndex){// save indexPrintWriter indexOutput = createWriter(dirpath + File.separator + indexName);indexOutput.print(bgIndex);indexOutput.flush();indexOutput.close();println("saveIndex: " + bgIndex);}void func(){// 功能示例String dirpath = createDir("drawings");saveIndex(dirpath, 1);}
需要引入的头文件:
import java.io.File;
import java.io.PrintWriter;
import android.os.Environment;
补充一点,如果要查找asserts下的文件是否存在,可以参考这篇文章:【代码】Android|判断asserts下的文件存在与否,以及普通文件存在与否。
相关文章:
【代码】Android|获取存储权限并创建、存储文件
版本:Android 11及以上,gradle 7.0以上,Android SDK > 29 获取存储权限 获取存储权限参考:Android 11 外部存储权限适配指南及方案,这篇文章直接翻到最下面,用XXPermissions框架。它漏了这个框架的使用方…...
每日一练 | 华为认证真题练习Day196
1、在如图所示的网络中,三台交换机运行RSTP,配置情况如图所示 根据图中配置情况判断根交换机为 A. SWA B. SWB C. SWC D. 无法确定 2、如图所示,在RT1路由器上配置OSPF多进程,其中RT1的进程100通过骨干区域和RT2建立OSPF邻居&…...
如何在Linux本地搭建Tale网站并实现无公网ip远程访问
文章目录 前言1. Tale网站搭建1.1 检查本地环境1.2 部署Tale个人博客系统1.3 启动Tale服务1.4 访问博客地址 2. Linux安装Cpolar内网穿透3. 创建Tale博客公网地址4. 使用公网地址访问Tale 前言 今天给大家带来一款基于 Java 语言的轻量级博客开源项目——Tale,Tale…...
论哪个行业官网颜值普遍较高,装修设计第二,无人敢称第一。
装饰设计公司官网普遍颜值较高的原因主要包括以下几点: 1. 美学要求: 装饰设计公司本身就是从事美学和艺术的行业,他们对于视觉效果和美感有着较高的要求,因此他们的官网在设计上往往会更加注重颜值。 2. 品牌形象:…...
Elastic Stack--08--SpringData框架
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 SpringData[官网: https://spring.io/projects/spring-data](https://spring.io/projects/spring-data) Spring Data Elasticsearch 介绍 1.SpringData-…...
华为OD机试 - 模拟数据序列化传输(Java JS Python C C++)
题目描述 模拟一套简化的序列化传输方式,请实现下面的数据编码与解码过程 编码前数据格式为 [位置,类型,值],多个数据的时候用逗号分隔,位置仅支持数字,不考虑重复等场景;类型仅支持:Integer / String / Compose(Compose的数据类型表示该存储的数据也需要编码)编码后数…...
使用Tokeniser估算GPT和LLM服务的查询成本
将LLM集成到项目所花费的成本主要是我们通过API获取LLM返回结果的成本,而这些成本通常是根据处理的令牌数量计算的。我们如何预估我们的令牌数量呢?Tokeniser包可以有效地计算文本输入中的令牌来估算这些成本。本文将介绍如何使用Tokeniser有效地预测和管…...
2-Docker-应用-多容器部署Django+Vue项目(nginx+uwsgi+mysql)
摘要: 本文详细介绍了如何使用Docker部署一个多容器DjangoVue项目,包括nginx、uwsgi和mysql。文章内容涵盖了基础知识回顾、需求分析、设计方案、实现步骤、技巧与实践、性能优化与测试、常见问题与解答以及结论与展望。 阅读时长:约60分钟…...
Vue 中的 key:列表渲染的秘诀
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...
Linux系统架构----nginx的服务基础
一.Nginx的概述 Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx稳定性高,而且系统资源消耗少Nginx相对于Apache主要处理静态请求,而apache主要处理动态请求Nginx是一款轻量级的Web 服务器/反向代理服务…...
项目管理工具及模板(甘特图、OKR周报、任务管理、头脑风暴等)
项目管理常用模板大全: 1. 项目组OKR周报 2. 项目组传统周报工作法 3. 项目甘特图 4. 团队名单 5. 招聘跟进表 6. 出勤统计 7. 年度工作日历 8. 项目工作年计划 9. 版本排期 10. 项目组任务管理 11. 项目规划模板 12. 产品分析报告 13. 头脑风暴 信息化项目建设全套…...
MySQL--索引底层数据结构详解
索引是什么? 索引是帮助MySQL高效获取数据的排好序的数据结构,因此可知索引是数据结构。 概念很抽象,但是类比生活中的例子就很容易理解,比如一本厚厚的书,我们想取找某一小节,我们可以根据目录去快速找到…...
如何解决爬虫程序访问速度受限问题
目录 前言 一、代理IP的获取 1. 自建代理IP池 2. 购买付费代理IP 3. 使用免费代理IP网站 二、代理IP的验证 三、使用代理IP进行爬取 四、常见问题和解决方法 1. 代理IP不可用 2. 代理IP速度慢 3. 代理IP被封禁 总结 前言 解决爬虫程序访问速度受限问题的一种常用方…...
如何考上东南大学计算机学院?
东南大学招生学院是计算机科学与工程学院、苏州联合研究生院,复试公平,不歧视双非考生,985院校中性价比较高,但近年热度在逐年上涨,需要警惕。 建议报考计算机科学与工程学院081200计算机科学与技术专业目标分数为380…...
双指针算法练习
27. 移除元素 题目 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑…...
桌面终端管理(实用+收藏篇)
桌面终端管理软件是管理和保护企业电脑数据安全的工具。 它能够帮助管理员更有效地控制和监督员工电脑的日常使用,软件的功能包括软件管理、硬件监控、远程管理、数据加密和防泄密、行为审计以及安全防护等。 桌面终端管理的核心要义 桌面终端管理不仅仅是对硬件设…...
day1-C++
1>提示并输入一个字符串,统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数要求使用C风格字符串完成。 代码: #include <iostream> #include <string.h> using namespace std;int main() {string str ;int low 0, …...
C++ 之LeetCode刷题记录(三十九)
😄😊😆😃😄😊😆😃 开始cpp刷题之旅。 目标:执行用时击败90%以上使用 C 的用户。 22. 括号生成 数字 n 代表生成括号的对数,请你设计一个函数,用…...
关于一个数组的小细节
机缘 写一个矩阵转置的代码用到了数组 收获 了解到输入数组的大小要在数组前面而不能先定义数组然后再输入 举例 #include <stdio.h>int main() {int a, b;scanf("%d %d ",&a,&b);int arr[a][b];for(int i 0;i < a;i){for(int j 0;j < b…...
吴恩达机器学习笔记 十八 制定一个性能评估标准 学习曲线 高偏差 高方差
一个模型的好坏的评估基准可以从下面几个方面考虑: 1.考虑人类在这个问题上的表现 2.对比竞争算法的表现 3.根据经验猜测 判断是高偏差还是高方差 训练样本数量越多,越难完美地拟合每个样本,因此 J_train 会逐渐增大一点点,但泛…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础
第三周 Day 3 🎯 今日目标 理解类(class)和对象(object)的关系学会定义类的属性、方法和构造函数(init)掌握对象的创建与使用初识封装、继承和多态的基本概念(预告) &a…...
