有关Android存储的相关概念辨析
我想念许多Android
开发人员在碰到有关存储的相关问题时,肯定遇到过“内部存储/内存”、“外部存储/外存”等类似的概念,尤其是将相关概念跟非开发人员解释时,那真是“秀才遇到兵,有理说不清哪”。包括我自己在内,之前也对这些概念有些认识不清。所以我觉得有必要对这些概念进行深入的辨析一下。
我曾经在Android手机外置SD卡(TF卡)的获取方法这篇博客中尝试获取Android
手机中所有外置存储卡的路径,并且它也奏效了,但是那时候我对这些概念还不十分的清楚他们之间的差别,所以就更加应该写这篇文章了。
首先,要弄明白这些概念:内置存储、外部存储、第二外部存储。
内置存储:即Internal Storage
,该存储一般情况下用户是不可以访问的,除非通过已安装应用或者刷过机获取了root权限。比如该目录“data/data/your-package-name
”即属于内置存储。
外部存储:即External Storage
,也叫首要外部存储(Primary External Storage
),属于内置于手机的共享的存储,用户可以通过插入USB线在主机电脑上作为一个驱动来访问它。例如我们常说“Nexus 5 32G”,其中的“32G”即指该部分存储。
第二外部存储:即Secondary External Storage
,是部分Android手机预留插口,可以插入的存储设备,如SD Card,这部分存储可以随时插拔。但并不是所有手机都支持可插拔的第二外部存储,例如Nexus 5,就不支持。作用Google的原生手机,这也是Google不推荐预留第二外部存储的良好体现。
我们知道,在Android 4.4(API 19)中,Android引进了“存储访问框架”(Storage Access Framework)。那么在新的API情况下,如何访问SD Card存储即第二外部存储呢?
新API下查看目录树与旧API有些许相似,但又有许多不同。
启动intent以选择目录树时,要像这样:Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, 42);
然后重写onActivityResult()
,将用户选择的Uri
传递给DocumentFile
帮助类。下面是个小例子,用以在选定的文件夹中列出所有文件,然后再创建新的文件:
public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
if (resultCode == RESULT_OK) {
Uri treeUri = resultData.getData();
DocumentFile pickedDir = DocumentFile.fromTreeUri(this, treeUri);
// List all existing files inside picked directory
for (DocumentFile file : pickedDir.listFiles()) {
Log.d(TAG, "Found file " + file.getName() + " with size " + file.length());
}
// Create a new file and write into it
DocumentFile newFile = pickedDir.createFile("text/plain", "My Novel");
OutputStream out = getContentResolver().openOutputStream(newFile.getUri());
out.write("A long time ago...".getBytes());
out.close();
}
}
DocumentFile.getUri()
返回的Uri可以灵活地跟各个版本的API一直使用。比如,你可以使用Intent.setData()
和Intent.FLAG_READ_URI_PERMISSION
将Uri
分享。如果你想要从本地代码中访问Uri
,你可以调用ContentResolver.openFileDescriptor()
,然后使用ParcelFileDescriptor.getFd()
或者detachFd()
来获取传统的POSIX
文件描述整型值。
有关Android存储的相关概念辨析的更多相关文章
- 一篇文章搞懂android存储目录结构
前言 前两天因为开发一个app更新的功能,我将从服务器下载的apk文件放在了内部存储目录(测试手机为小米,路径为:data/user/0/packagename/files)下面,然后安装的时候一直安 ...
- MySQL索引分类及相关概念辨析
本文链接:https://www.cnblogs.com/ibigboy/p/16198243.html 之前的一篇<MySQL索引底层数据结构及原理深入分析>很受读者欢迎,成功地帮大家揭 ...
- Android存储访问及目录
Android存储访问及目录 Android的外部存储 Android支持外部存储(case-insensitive filesystem with immutable POSIX permissio ...
- Android存储之SQLite数据库
Android存储之SQLite数据库数据库 创建数据库 package --; import android.content.Context; import android.database.sql ...
- Android存储路径你了解多少?
在了解存储路径之前,先来看看Android QQ的文件管理界面,了解一下QQ的数据文件路径来源,到底是来源于什么地方? 手Q文件管理对应存储目录 我的文件:是指放在QQ指定目录下的文件:/tencen ...
- Android 存储(本地存储 SD卡存储 SharedPreference SQLite ContentProvider)
本文出自:http://blog.csdn.net/dt235201314/article/details/73176149 源码下载欢迎Star(updating):https://github.c ...
- android存储方式的应用场景
作为一个完整的应用程序,数据存储操作是必不可少的.因此,Android系统一共提供了四种数据存储方式.分别是:SharePreference.文件存储.SQLite. Content Provider ...
- Android开发学习——android存储
Android的存储 内部存储空间RAM内存:运行内存,相当于电脑的内存ROM内存:存储内存,相当于电脑的硬盘外部存储空间 SD卡:相当于电脑的移动硬盘 * 2.2之前,sd卡路径:sdcard ...
- Android存储
Android的四种数据存储方式: 1.SharedPrefrences 2.SQLite 3.Content Provider 4.File SharedPrefrences: 1.是一种轻型的数据 ...
随机推荐
- Composer生成PHP依赖包
近期在用一些扩展或者类库的时候,偶尔会碰到使用Composer生成php包的问题.总结步骤如下:window下安装composer:参考http://www.kankanews.com/ICkengi ...
- 正则表达式 \b (转)
引用网上一段话: \b 是正则表达式规定的一个特殊代码(好吧,某些人叫它元字符,metacharacter),代表着单词的开头或结尾,也就是单词的分界处.虽然通常英文的单词是由空格,标点符号或者换行来 ...
- Node.js 开发指南笔记
第一章:node简介 介绍了node是什么:node.js是一个让javascript运行在服务器端的开发平台, node能做些什么:[书上的] 具有复杂逻辑的网站 基于社交网络的大规模Web应用 W ...
- SQL Server使用规范
原文:SQL Server使用规范 常见的字段类型选择 1.字符类型建议采用varchar/nvarchar数据类型 2.金额货币建议采用money数据类型 3.科学计数建议采用numeric数据类型 ...
- thinkphp学习笔记6—url模式
原文:thinkphp学习笔记6-url模式 入口文件是应用的唯一入口,因为可以多入口,每个应用可以对应一个入口文件,系统会从rul参数中解析当前请求的模块,控制器,操作.ThinkPHP是区分大小写 ...
- Web采矿技术
一.数据挖掘 数据挖掘是运用计算机及信息技术,从大量的.不全然的数据集中获取隐含在当中的实用知识的高级过程.Web 数据挖掘是从数据挖掘发展而来,是数据挖掘技术在Web 技术中的应用.Web 数据 ...
- Mysql编写定时任务事件
原文:Mysql编写定时任务事件 场景: 例如:某系统,用户每天只能拥有一次的抽奖机会,抽过后当天就不可再抽,但是过了24:00点后用户就重新拥有一次抽奖机会.像这种需要数据库定时对某个字段进行更新操 ...
- C#操作Xml:使用XmlReader读Xml
XmlDocument和XElement在读取Xml时要将整个Xml文档放到内存中去操作,这样做操作简单,但是很费内存和IO(可能是磁盘IO或者网络IO):而在有些场景下我们必须考虑尽可能节省内存和I ...
- Redis源代码分析(一)--Redis结构解析
从今天起,本人将会展开对Redis源代码的学习,Redis的代码规模比較小,很适合学习,是一份很不错的学习资料,数了一下大概100个文件左右的样子,用的是C语言写的.希望终于能把他啃完吧,C语言好久不 ...
- HQL语句大全
第 15 章 HQL: Hibernate查询语言 Hibernate配备了一种很强大的查询语言,这样的语言看上去很像SQL.可是不要被语法结构 上的类似所迷惑,HQL是很有意识的被设计为全然面向对象 ...