关于Android的存储

Android 13的Scoped Storage原则下的特定的公有目录 不过,即便在 Scoped Storage 下,应用默认仍然可以直接访问一些特定的公有目录,这些通常是与媒体和文档相关的标准目录。请注意,尽管应用可以访问上述目录,但在某些操作上(比如写入操作),可能仍需遵循特定的指导原则,比如通过系统文件选择器来确保用户意图的明确性。: 这些是与音频相关的目录,应用可以访问这些位置的音频文件,根据类型不同,可能用于铃声、闹钟声音、通知声音等。: 应用可以读写这个目录下的照片和视频,通常用于相机拍摄的内容。: 应用可以在此目录下创建自己的子目录来保存图片和其他图像文件。 阅读详情

关于数据的存储

https://medium.com/@sandeepkella23/exploring-data-storage-in-android-types-advantages-datastore-real-time-use-cases-and-best-8bb42fa6792e

sp,datastore,内部存储,外部存储,数据库等对比,大概的一些概念

关于内部存储和外部存储的一些区别,以及API29与API30平台上的区别PL这个视频大概有说到

https://www.youtube.com/watch?v=TkOzcyzH1hU&list=PLQkwcJG4YTCR9jZq8O19nUL2hLqmLYX4M

内部存储只有自己的应用可以访问,而且应用卸载后,可一起删除

外部存储的的话,有个问题,就是应用卸载之后,文件还遗留着,然后Android就出了storage scope来解决这个问题,但是这个在Android 10之后引入的storagescope,但是在Andorid 11之后才强制;

内部存储

读取内部文件

   private suspend fun loadPhotosFromInternalStorage(): List<InternalStoragePhoto> {
        return withContext(Dispatchers.IO) {
            val files = filesDir.listFiles()
            files?.filter { it.canRead() && it.isFile && it.name.endsWith(".jpg") }?.map {
                val bytes = it.readBytes()
                val bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.size)
                InternalStoragePhoto(it.name, bmp)
            } ?: listOf()
        }
    }

写入内部文件

 private suspend fun savePhotoToInternalStorage(filename: String, bmp: Bitmap): Boolean {
        return withContext(Dispatchers.IO) {
            try {
                openFileOutput("$filename.jpg", MODE_PRIVATE).use { stream ->
                    if(!bmp.compress(Bitmap.CompressFormat.JPEG, 95, stream)) {
                        throw IOException("Couldn't save bitmap.")
                    }
                }
                true
            } catch(e: IOException) {
                e.printStackTrace()
                false
            }
        }
    }

删除内部文件

 private suspend fun deletePhotoFromInternalStorage(filename: String): Boolean {
        return withContext(Dispatchers.IO) {
            try {
                deleteFile(filename) //context就有的方法
            } catch (e: Exception) {
                e.printStackTrace()
                false
            }
        }
    }

外部存储

读取外部文件

首先要有权限READ_EXTERNAL_STORAGE

//通过contentprovider来查询外部共享媒体文件
    private suspend fun loadPhotosFromExternalStorage(): List<SharedStoragePhoto> {
        return withContext(Dispatchers.IO) {
            val collection = sdk29AndUp { //api29以上
                MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL)
            } ?: MediaStore.Images.Media.EXTERNAL_CONTENT_URI

            val projection = arrayOf(
                MediaStore.Images.Media._ID,
                MediaStore.Images.Media.DISPLAY_NAME,
                MediaStore.Images.Media.WIDTH,
                MediaStore.Images.Media.HEIGHT,
            )
            val photos = mutableListOf<SharedStoragePhoto>()
            contentResolver.query(
                collection,
                projection,
                null,
                null,
                "${MediaStore.Images.Media.DISPLAY_NAME} ASC"
            )?.use { cursor ->
                val idColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID)
                val displayNameColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME)
                val widthColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.WIDTH)
                val heightColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.HEIGHT)

                while(cursor.moveToNext()) {
                    val id = cursor.getLong(idColumn)
                    val displayName = cursor.getString(displayNameColumn)
                    val width = cursor.getInt(widthColumn)
                    val height = cursor.getInt(heightColumn)
                    val contentUri = ContentUris.withAppendedId(
                        MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                        id
                    )
                    photos.add(SharedStoragePhoto(id, displayName, width, height, contentUri))
                }
                photos.toList()
            } ?: listOf()
        }
    }

写入外部文件

权限WRITE_EXTERNAL_STORAGE

 //通过contentprovider向媒体库写入图片数据
    private suspend fun savePhotoToExternalStorage(displayName: String, bmp: Bitmap): Boolean {
        return withContext(Dispatchers.IO) {
            val imageCollection = sdk29AndUp {
                MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)
            } ?: MediaStore.Images.Media.EXTERNAL_CONTENT_URI

            val contentValues = ContentValues().apply {
                put(MediaStore.Images.Media.DISPLAY_NAME, "$displayName.jpg")
                put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")
                put(MediaStore.Images.Media.WIDTH, bmp.width)
                put(MediaStore.Images.Media.HEIGHT, bmp.height)
            }
            try {
                contentResolver.insert(imageCollection, contentValues)?.also { uri ->
                    //前面只是加了数据库的值,返回了UIR,
                    //然后我们需要将返回的URI中,写入图片数据
                    contentResolver.openOutputStream(uri).use { outputStream ->
                        if(!bmp.compress(Bitmap.CompressFormat.JPEG, 95, outputStream)) {
                            throw IOException("Couldn't save bitmap")
                        }
                    }
                } ?: throw IOException("Couldn't create MediaStore entry")
                true
            } catch(e: IOException) {
                e.printStackTrace()
                false
            }
        }
    }

删除外部文件

//这里会比较不一样,早期的版本可以直接删除
//Android10之后需要有权限
//没有权限,则需要创建删除请求,系统会有弹窗,让用户来进行确认
 private suspend fun deletePhotoFromExternalStorage(photoUri: Uri) {
        withContext(Dispatchers.IO) {
            try {
                contentResolver.delete(photoUri, null, null)
            } catch (e: SecurityException) {
                val intentSender = when {
                    Build.VERSION.SDK_INT >= Build.VERSION_CODES.R -> {
                        MediaStore.createDeleteRequest(contentResolver, listOf(photoUri)).intentSender
                    }
                    Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q -> {
                        val recoverableSecurityException = e as? RecoverableSecurityException
                        recoverableSecurityException?.userAction?.actionIntent?.intentSender
                    }
                    else -> null
                }
                intentSender?.let { sender ->
                    intentSenderLauncher.launch(
                        IntentSenderRequest.Builder(sender).build()
                    )
                }
            }
        }
    }

深入理解光流法外推雷达回波 背景介绍 鉴于本人实在太过疲惫和劳累,一些简单的便于理解的废话就不在记录,耗费两天时间研究了一下光流法,本帖用于记录学习过程中源码的难点细节。 使用光流预测的核心有两个利用多张连续回波图像(变分)或者相邻两张回波图(交叉相关,LK等)计算出光流场(速度矢量场),之后利用半拉格朗日方法进行外推。 半拉格朗日方法 三时间步半拉格朗日方法,其核心公式如下 但这个有点难理解,但看一维的图就很好理解 它的核心就是迭代求Am(位移矢量),如果理解困难的话,其实质上就是通过未来迭代(猜)出当前时刻的Am找到过去的假设 阅读详情

相关推荐

静态与动态LACP链路聚合:原理、配置与排错实战指南

链路聚合技术是提升网络带宽与可靠性的核心方案,通过将多个物理端口逻辑捆绑,实现带宽叠加与链路冗余。其原理基于IEEE 802.3ad标准,通过负载均衡算法将数据流分布到不同物理链路,既避免了数据包乱序,又提升了整体吞吐量。该技术的核心价值在于消除单端口瓶颈、提供毫秒级故障切换,并能简化网络拓扑管理。在企业服务器接入、数据中心互联及虚拟化平台等场景中,链路聚合已成为构建高可用网络的基础。实践中,动态LACP模式通过协议报文协商,能主动检测链路故障并防止配置错误导致的网络环路,相比静态聚合更为可靠。本文将深入解

weixin_31412781的博客 269

【Android Framework系列】第17章 Android Q沙箱模式(Scoped Storage)

App TargetSDK > 28 即 Android10(Q)及以上项目,Google限制了存储沙箱模式,在Android10(Q)以上的设备建议使用私有目录data/data,无法再直接访问外部SD卡存储目录,如需要使用外部SD卡存储目录则需要通过SAF、MediaStore接口访问,并且只能访问特定的外部SD卡存储目录,如Downloads、Documents、Pictures 、DCIM、Movies、Music、Ringtones

Yvan 3077

STM32G474的HRTIM实战:用CubeMX配置互补PWM驱动全桥电路(附移相算法代码)

本文详细介绍了如何使用STM32G474的HRTIM高分辨率定时器,通过CubeMX配置互补PWM驱动全桥电路,并附移相算法代码。内容涵盖HRTIM硬件架构解析、CubeMX配置全流程、移相控制算法实现及调试技巧,为数字电源和电机控制领域提供实用解决方案。

weixin_27017211的博客 486

Android 10的ScopedStorage(分区存储)的介绍

Android 10的ScopedStorage(分区存储)的介绍 . Scoped Storage的由来 Android长久以来都支持外置存储空间这个功能,也就是我们常说的SD卡存储。这个功能使用得极其广泛,几乎所以开发者在开发的时都喜欢在SD卡的根目录下建立一个自己应用的专属的目录,用来存放各类文件和数据。导致SD卡的文件管理变的异常混乱。而且用户即使我卸载了一个完全不再使用的程序,它所产生的垃圾文件却可能会一直保留在我的手机上,不会被自动删除,这就使用户的存储空间一直处于十分紧张的状态,还浪费了大量

weixin_42324979的博客 3610

VS2015编译配置GDAL(图文并茂、超详细!!!)

文章目录一、GDAL介绍二、下载GDAL三、修改源代码四、工具命令提示符操作五、编译GDAL六、安装GDAL七、在VS2015的项目中配置GDAL八、添加环境变量九、测试是否配置成功 一、GDAL介绍 GDAL(Geospatial Data Abstraction Library)是一个在XMIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。OGR是GDAL项目的一个分支,功能与GDAL类似,只不过它提供对矢量数据的支持。因此

weixin_46196863的博客 3758

解锁微信小程序Camera组件的隐藏技能:连续扫码背后的逻辑与陷阱

本文深入解析微信小程序Camera组件在连续扫码功能中的技术原理与优化方案,涵盖识别率提升、内存管理策略及典型问题排查。通过实战参数对比和代码示例,帮助开发者解决扫码枪应用中的性能损耗与界面卡顿问题,提升零售、物流等场景的工作效率。

weixin_29019241的博客 495

Android10和Android11作用域存储Scoped Storage详解

理解作用域存储 Android长久以来都支持外置存储空间这个功能,也就是我们常说的SD卡存储。这个功能使用得极其广泛,几乎所有的App都喜欢在SD卡的根目录下建立一个自己专属的目录,用来存放各类文件和数据。 那么这么做有什么好处吗?第一,存储在SD卡的文件不会计入到应用程序的占用空间当中,也就是说即使你在SD卡存放了1G的文件,你的应用程序在设置中显示的占用空间仍然可能只有几十K。第二,存储在SD卡的文件,即使应用程序被卸载了,这些文件仍然会被保留下来,这有助于实现一些需要数据被永久保留的功能。 然而,这些

ruanyandong的博客 4802

编码约定的自由度:重新思考Hamming码在实际工程中的灵活应用

本文探讨Hamming码在实际工程中的灵活应用,突破标准实现的思维定式。通过分析不同编码约定的优缺点和资源受限环境下的设计权衡,展示如何根据嵌入式系统、通信协议等具体需求定制汉明码实现,优化编解码效率并降低硬件开销。

perl8的博客 179

轻松适配Android 10 Scoped Storage 分区存储

Android 10(API 级别 29)引入了多项功能和行为变更,目的是更好地保护用户的隐私权。其中最重要的变化之一就是存储访问权限。 Android 10中,Google针对外部存储引入了一个新特性,它的名字叫:Scoped Storage,Google官方对它的翻译为分区存储,我们也可以把它叫做作用域存储,至于为什么? 本文中,我们还是将它翻译为分区存储。好了,我要开始提问了! 问题一、...

HurryYu的博客 4327

OpenAI Codex 科研实战:从文献整理到论文初稿的自动化流水线

在科研工作中,大量时间消耗在文献整理、数据清洗、结果反复排版等重复性任务上,而非真正的思考与创新。AI 编程代理作为一种能理解自然语言指令并直接操作文件、执行脚本的命令行工具,正逐渐改变科研工作流的组织方式。它基于云端大模型推理,本地无需 GPU,通过解析用户意图,自动完成代码生成、文件批量处理与任务拆解,将传统需要手动操作的工程过程转化为可验证、可追溯的指令执行。这类工具在学术场景中的价值尤为突出:科研人员可以将文献总结、数据预处理、统计分析与可视化出图交给代理完成,从而把精力聚焦在研究问题本身。Open

weixin_34318326的博客 459

【Segment Anything Model】三:SAM模型微调自定义数据集,更改混合提示方式:点,框,点框混合

1.微调SAM预备知识。

cvxiayixiao的博客 1万+

基于Android studio学习安卓之数据存储

在移动应用开发中,数据存储是一个非常重要且必不可少的技术。无论是保存用户的信息、记录应用的状态,还是缓存网络请求的数据,数据存储都是必须处理的需求。而在安卓开发中,我们有许多选项可以选择来进行数据存储。下面我们介绍几种安卓的常见的数据存储方式,包括Shared Preferences、数据库存储等。在Android中,SharedPreferences是一种轻量级的存储机制,用于存储和检索键值对数据。它提供了一种简单的方法来保存应用程序的持久化数据,包括用户首选项、设置信息、应用程序状态等。

qq_30665153的博客 3590

【MATLAB-app】csdn上第一套关于matlab appdesigner界面设计 系列“视频课”来啦~~

写作时间: 2020-12-10 标题: 01_为什么推荐你学习appdesigner? 目录: 1.什么是appdesigner? 2.appdesigner能干什么,有什么好处? 3.怎么学习?保证你一周内能够学会! 4.我的课程总目录 5.重磅来袭(如何获取学习资料代码+文档+视频) 正文: 1.什么是appdesigner? 2.appdesigner能干什么,有什么好处? 3.怎么学习?保证你一周内能够学会! 4.我的课程总目录 5.重磅来袭(如何获取学习资料代码+文档+视频) THE END

wind 2万+

【Android】安卓中的存储

【Android】安卓中的存储 1、存储在App内部 最简单的一种。在尝试过程中发现,手机中很多文件夹都没有权限读写。我们可以将我们需要写的文件存放到App中的files文件夹中,当然我们有权限在整个App中读写文件 可以通过API获取一个file对象,这里的this就是MainActivity类 // 获取当前包下的files路径 /data/data/top.woodwhale.qqlogin/files File filesDir = this.getFilesDir(); 之后就可以通过文件输出

woodwhale的博客 1643

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【Android】安卓存储

文章目录安卓存储一、概述二、SharedPreferennces 的使用1.activity_shared_prefences.xml布局2.SharedPreferencesActivity三、**SQLite数据库**1.SQLite简介2.SQLite的特点3.简单实现3.1 页面布局3.2 Activity功能实现3.3 效果展示 安卓存储 一、概述 存储方式: SharedPreferences 临时数据存储 本质是xml,存在标签冗余 不安全,xml可以直接解析 数据轻量级 SQL..

懂得一千零一种,赋予你失败的方法! 580

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Android安卓——数据存储之数据库存储

在安卓开发中,对于用户端数据的存储常使用SQLite数据库。 使用SQLite数据库进行数据的增删查改操作。后面附有代码 一、SQLite数据库1、SQLite数据库简介(1)、SQLite数据库是一个开源的嵌入式关系数据库。(2)、特点: 更加适用于嵌入式系统,嵌入到使用它的应用程序中去。 占用非常少的内存,运行高效可靠,可移植性好。

Deniece_X的博客 4468

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

android 内部存储 其他,安卓内部存储跟外部存储

存储相关的知识使用AndroidStudio的DDMS,打开File Explorer,我们可以看到下图:这张图是手机根目录下的完整目录结构图,内外部存储均包含在内。不过有些文件内容需要root权限才能看到。存储相关.png/data文件路径下文件的存储/data/app文件夹下存放三方应用的apk文件;/data/data文件夹下存放系统应用和三方应用的包私有数据,每个应用都有独属于自己的包。接...

weixin_29595517的博客 1283

Android安卓——数据存储之文件存储

在安卓中对数据的存储有了SQLite数据库存储数据,在本次学习的是对文件的存储。利用SharedPerences将数据存储在文件中。 实战:本次学习准备的实战是总结性写了一下数据内部存储的读写、文件内部存储的读写、在SD卡中的读写。 一、 简单存储SharedPreferences1、简单存储简介 SharedPreferences是一种轻量级的数据保存方式。 通过SharedPrefer

Deniece_X的博客 1457

android 存储策略,安卓数据存储方案

持久化技术简介数据持久化就是指将那些内存中的瞬时数据保存在存储设备中,保证即使在手机或电脑关机的情况下,这些数据仍然不回丢失。保存在内存中的数据是处于瞬时状态的,而保存在存储设备中的数据是处于持久状态的,持久化技术则提供一种机制可以让数据在瞬时状态和持久状态之间进行转换。Android 系统中主要提供了3种方式,即文件存储、SharedPreference 存储以及数据存储。1、文件存储文件存储是...

weixin_29864831的博客 374

【Android 练习】安卓存储练习

文章目录安卓存储练习一、概述二、SharedPreferennces 的使用1.activity_shared_prefences.xml布局2.SharedPreferencesActivity三、SQLite数据库1.SQLite简介2.SQLite的特点3.简单实现3.1 页面布局3.2 Activity功能实现3.3 效果展示 安卓存储练习 一、概述 存储方式: SharedPreferences 临时数据存储 本质是xml,存在标签冗余 不安全,xml可以直接解析 数据轻量级 SQLi.

懂得一千零一种,赋予你失败的方法! 531

android存储卡,如何为你的安卓手机选择合适的存储卡

原标题:如何为你的安卓手机选择合适的存储卡IT之家1月13日消息 有些用户可能有过这样的疑惑:想要给手机加装SD卡,但却不知道如何选择。在这里CNET的编辑带来了一篇SD卡的选购心得。 市面上的MicroSD卡门类众多,但并不是每张卡都适合我们手上的安卓手机和平板。在这里,在SDHC、SDXC,以及Class 10和UHS-1的存储卡之间如何进行选择?笔者列出了一些窍门,帮助大家挑选出最符合设备、...

weixin_29094539的博客 338

android 微信文件存储,安卓微信文件存储位置

新版的微信能录制小视频,也能把小视频发送给自己或分享给好友或者是朋友圈,也能将其收藏,但是,如果想要分享给qq好友等等,在微信是不能直接发送到qq上的,这时候就要找到其存储位置一切就都好办了。打开微信先录制好小视频,可以是提前录好的,然后再打开手机主面板的“文档”(小编的语言换成英语了所以是documents)打开手机的根目录,找到“tencent”点击打开,再找到“MicroMsg”这个文件夹点...

weixin_30802399的博客 8723

android 应用存储目录下,乱乱乱,安卓系统的存储目录该怎么管理

原标题:乱乱乱,安卓系统的存储目录该怎么管理前段时间QQ偷偷删除手机图片一事闹得沸沸扬扬,虽然之后腾讯和华为官方都分别作出了解释和回应,但仍然给很多用户带来了疑惑。那么用户该如何管理好手机中的文件,并且如何定时对不需要的文件进行清理操作呢?01乱七八糟的图片为何出现当用户在打开手机自带的相册应用后,经常会在其中看到一些乱七八糟的图片,比如广告图片、表情包、应用头像等。而造成这一现象的主要原因,就是...

weixin_31108679的博客 1819

android 存储卡 合并,安卓手机合并内存卡到内置存储

本方法的优势是使用的都是官方工具,成功率极高1:mac需要安装adb工具首先需要打开Mac的终端1.1:安装homebrew:在终端中输入以下代码回车ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”1.2:安装adb:上步安装完后在终端中输入以下代码回车brew cas...

weixin_33554776的博客 2587

安卓存储

安卓存储 先搞懂目录结构 一篇文章搞懂android存储目录结构 具体配置文件放在手机什么目录下呢? //https://blog.youkuaiyun.com/Kelaker/article/details/80471352?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-

caicaptain 202

Android安卓动态获取存储权限,保存文件到外部存储

添加存储权限 <!--外部存储的写权限--><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><!--外部存储的读权限--><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 2.逻辑部分 定义变量 private static final int REQU

qq_37196621的博客 5559
上一篇: datastore读取方式
下一篇: Room 引用复杂数据
lynn8570_blog
博客等级 码龄10年 254粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值