Android外部存储 - 官方文档解读
预备知识:External Storage Technical Information
摘要:
"The
WRITE_EXTERNAL_STORAGE permission must only grant write access to the
primary external storage on a device. Apps must not be allowed to write
to secondary external storage devices, except in their package-specific
directories as allowed by synthesized permissions. Restricting writes in
this way ensures the system can clean up files when applications are
uninstalled."
"Starting in Android 4.4, multiple external storage
devices are surfaced to developers through
Context.getExternalFilesDirs(), Context.getExternalCacheDirs(), and
Context.getObbDirs()."
Q&A:
*Primary external storage? Secondary external storage?
-参考source.android.com/devices/tech/storage/config-example.html
有的手机不支持SD卡扩展(如Nexus 4),所以没有secondary;
有的手机支持(如Note 3),所以区分primary和secondary。
是否primary,由android/frameworks/base/core/res/res/xml/storage_list.xml决定。
一般地,primary是由内部存储(internal storage,比如NAND eMMC)中划分一部分为外部存储(external
storage);mountPoint为"/storage/sdcard0";subsystem为"fuse",也就是由FUSE
daemon模拟的。
secondary是可插拔(removable)的SD卡,mountPoint为"/storage/sdcard1"或"/storage/extSdCard";subsystem为"sd"。
*什么是package-specific directories?
-如package名为com.app.foo在primary/secondary的Android/data/com.app.foo目录。
/Android/data目录是由android/system/core/sdcard.c::handle_mkdir被调用时创建的,并同时新建.nomedia文件。
Context.getExternalFilesDirs(), Context.getExternalCacheDirs()会触发创建package-specific directories。
而Context.getObbDirs()会触发创建/Android/obb/。
*app对于SD卡的write权限范围分别在哪儿?
-在Note3上试验:
1.不声明WRITE_EXTERNAL_STORAGE情况下,不管是primary还是secondary,在package目录下能够写文件,在Android/data/下都会抛出IOException;
2.声明后,primary能够在Android/data/目录下写文件,而secondary依然IOException。
"For
example, the app with package name com.example.foo can now freely
access Android/data/com.example.foo/ on external storage devices with no
permissions."
"Specifically, configuration and log files should only be stored on internal storage where they can be effectively protected."
Android外部存储 - 官方文档解读的更多相关文章
- Cuda 9.2 CuDnn7.0 官方文档解读
目录 Cuda 9.2 CuDnn7.0 官方文档解读 准备工作(下载) 显卡驱动重装 CUDA安装 系统要求 处理之前安装的cuda文件 下载的deb安装过程 下载的runfile的安装过程 安装完 ...
- 【Java架构:基础技术】一篇文章搞掂:Spring Boot 官方文档解读
本文篇幅较长,建议合理利用右上角目录进行查看(如果没有目录请刷新). 本文内容大部分是翻译和总结官方文档,可以到https://docs.spring.io/spring-boot/docs查看(此地 ...
- FluentValidation:C#后端输入验证框架的官方文档解读
参照 FluentValidation 的官方文档写的例子,方便日后查看和使用. 原文:https://github.com/JeremySkinner/FluentValidation/wiki H ...
- Python 官方文档解读(2):threading 模块
使用 Python 可以编写多线程程序,注意,这并不是说程序能在多个 CPU 核上跑.如果你想这么做,可以看看关于 Python 并行计算的,比如官方 Wiki. Python 线程的主要应用场景是一 ...
- Google android开发者 中国官方文档开放了呀
Google官方开发文档地址 包括 android , android TV
- android自定义控件(一) 官方文档的翻译
构建自定义组件 Android中,你的应用程序程序与View类组件有着一种固定的联系,例如按钮(Button).文本框(TextView),可编辑文本框(EditText),列表框(ListView) ...
- Python 官方文档解读(1):66 个内置函数
Python 解释器 (CPython 3.7)内置有 66 个函数,这些函数在任何时刻都是可用的.此文是为了对这 66 个函数进行简单的梳理,便于以后可能用到它们时能想到. 1. abs(x) 返回 ...
- 微信小程序开发官方文档解读
创建页面 在这个教程里,我们有两个页面,index 页面和 logs 页面,即欢迎页和小程序启动日志的展示页,他们都在 pages 目录下.微信小程序中的每一个页面的[路径+页面名]都需要写在 app ...
- 【pytest官方文档】解读fixtures - 1.什么是fixtures
在深入了解fixture之前,让我们先看看什么是测试. 一.测试的构成 其实说白了,测试就是在特定的环境.特定的场景下.执行特定的行为,然后确认结果与期望的是否一致. 就拿最常见的登录来说,完成一次正 ...
随机推荐
- Michael Kors成了时尚行业的公敌-股票频道-和讯网
Michael Kors成了时尚行业的公敌-股票频道-和讯网 Michael Kors成了时尚行业的公敌 字号 评论 邮件 纠错 2014年03月03日17:32 来源:财经天下 全球消费不 ...
- wordpress在window下完美实现301重定向的方法
问题: 首先,简单说一下关于301重定向的问题,最简单的理解就是,假设你的主机上绑定有 www.uilike.cn, uilike.cn, www.uiseo.cn三个域名,当你想输入 uilike. ...
- hdu4491 Windmill Animation(计算几何)
Windmill Animation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- android技术牛人的博客[转]
Android+JNI调用–文件操作 开发环境:Windows xp sp3 +MyEclipse 8.6+android2.3.3+jdk1.6+android-ndk-r6b JNI概述: ...
- Head First SQL笔记
看的时候总结了一下,如下: Chapter 1: 创建数据库 CREATE DATABASE database_name; 使用数据库 USE database_name; 创建表 CRATE TAB ...
- python邮件发送脚本
转自:http://phinecos.cnblogs.com/ #!/usr/bin/python #coding=utf-8 #@author:dengyike #@date:2010-09-28 ...
- ASP.NET WebApi 简单记录
//获取当前提交过来的Request对象 var request = System.Web.HttpContext.Current.Request;
- zoj 3710 Friends
#include<stdio.h> #include<string.h> ][],h; int main(int argc, char* argv[]) { int t,i,n ...
- JavaSE复习日记 : 条件判断语句
/* 条件控制语句:if(){}else{} 语法: 第一种结构:有不执行的情况 if(boolean表达式){ //第一位真,就执行里面的语句,为假就不执行 java语句; } 第二种结构: if( ...
- C++内联函数与宏定义
用内联取代宏: 1.内联可调试: 2.可进行类型安全检查或自动类型转换: 3.可访问成员变量. 另外,定义在类声明中的成员函数自动转化为内联函数. 文章(一) 内联函数与宏定义 在C中,常用预处理语句 ...