我想念许多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存储的相关概念辨析的更多相关文章

  1. 一篇文章搞懂android存储目录结构

    前言 前两天因为开发一个app更新的功能,我将从服务器下载的apk文件放在了内部存储目录(测试手机为小米,路径为:data/user/0/packagename/files)下面,然后安装的时候一直安 ...

  2. MySQL索引分类及相关概念辨析

    本文链接:https://www.cnblogs.com/ibigboy/p/16198243.html 之前的一篇<MySQL索引底层数据结构及原理深入分析>很受读者欢迎,成功地帮大家揭 ...

  3. Android存储访问及目录

    Android存储访问及目录 Android的外部存储 Android支持外部存储(case-insensitive filesystem with immutable POSIX permissio ...

  4. Android存储之SQLite数据库

    Android存储之SQLite数据库数据库 创建数据库 package --; import android.content.Context; import android.database.sql ...

  5. Android存储路径你了解多少?

    在了解存储路径之前,先来看看Android QQ的文件管理界面,了解一下QQ的数据文件路径来源,到底是来源于什么地方? 手Q文件管理对应存储目录 我的文件:是指放在QQ指定目录下的文件:/tencen ...

  6. Android 存储(本地存储 SD卡存储 SharedPreference SQLite ContentProvider)

    本文出自:http://blog.csdn.net/dt235201314/article/details/73176149 源码下载欢迎Star(updating):https://github.c ...

  7. android存储方式的应用场景

    作为一个完整的应用程序,数据存储操作是必不可少的.因此,Android系统一共提供了四种数据存储方式.分别是:SharePreference.文件存储.SQLite. Content Provider ...

  8. Android开发学习——android存储

    Android的存储 内部存储空间RAM内存:运行内存,相当于电脑的内存ROM内存:存储内存,相当于电脑的硬盘外部存储空间 SD卡:相当于电脑的移动硬盘    * 2.2之前,sd卡路径:sdcard ...

  9. Android存储

    Android的四种数据存储方式: 1.SharedPrefrences 2.SQLite 3.Content Provider 4.File SharedPrefrences: 1.是一种轻型的数据 ...

随机推荐

  1. HDU 4123 Bob’s Race 树的直径+单调队列

    题意: 给定n个点的带边权树Q个询问. 以下n-1行给出树 以下Q行每行一个数字表示询问. 首先求出dp[N] :dp[i]表示i点距离树上最远点的距离 询问u, 表示求出 dp 数组中最长的连续序列 ...

  2. cer证书签名验证

    一个cer还需要一个签名的证书本身,这是为了防止cer证书被篡改. 有两种类型的证书: 1. 根证书 2. 由根证书颁发子证书. 特根证书.它是自签名. 而其它子证书的签名公钥都保存在它的上级证书里面 ...

  3. AspNetPager使用指南

    一.AspNetPager支持两种方式分页: 一种是PostBack方式分页, 一种是通过Url来实现分页以及Url重写功能 二.AspNetPager支持各种数据绑定控件GridView.DataG ...

  4. 词组缩写(isalpha()的应用)

    Problem Description 定义:一个词组中每个单词的首字母的大写组合称为该词组的缩写.比如,C语言里常用的EOF就是end of file的缩写.   Input 输入的第一行是一个整数 ...

  5. linux_增加用户组_删除用户

    添加账号组 /usr/sbin/groupadd iknow 添加账号 /usr/sbin/useradd  -g iknow -d /home/iknow/ iknow 更改密码 passwd 选项 ...

  6. 从头开始学JavaScript (五)——操作符(二)

    原文:从头开始学JavaScript (五)--操作符(二) 一.乘性操作符 1.乘法:*      乘法操作符的一些特殊规则: 如果操作数都是数值,按照常规的乘法计算,如果乘积超过了ECMAscri ...

  7. 堆VS栈

    c#堆VS栈(Part One) 前言 本文主要是讲解C#语言在内存中堆.栈的使用情况,使读者能更好的理解值类型.引用类型以及线程栈.托管堆. 首先感谢原文作者:Matthew Cochran 为我们 ...

  8. 跟着大神重写的KNN 文档归类小工具

    ·背景 在知道KNN之前,楼主有时候会粗糙地做一些分类模型的计算.在拜读了Orisun大神[http://www.cnblogs.com/zhangchaoyang/articles/2162393. ...

  9. 08. 删除重复&海量数据

    原文:08. 删除重复&海量数据 重复数据,通常有两种:一是完全重复的记录,也就是所有字段的值都一样:二是部分字段值重复的记录. 一. 删除完全重复的记录完全重复的数据,通常是由于没有设置主键 ...

  10. 3D人脸识别预处理,3D face recognition preprocess

    本文由兔崩溃公布http://blog.csdn.net/smartempire/article/details/31373817. 转载请注明出处.howdeshui#163.com 近期在做三维人 ...