Android Environment.getExternalStorageDirectory() 获取的是内部存储还是外部存储?
这几天在做Android应用的远程更新功能,将下载的更新包放在移动设备上指定的文件夹。
用的是 Environment.getExternalStorageDirectory() 这种方法。然后在获取的文件夹中新建一个hkapp文件夹,用来存放下载的apk文件。
那么,这个hkapp文件究竟是在那块存储区域呢?
一開始,看看网上的API,已经这种方法的字面意思。想当然地以为它就是获取SD卡上的文件夹,而不是手机的内部存储。
当然。除了望文生义之外,似乎还有确凿的证据支持我的观点。那就是在执行的时候报错,提示权限不足,也就是要配置訪问外部存储的权限:
- <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
嗯,看上去就是在获取SD卡了...
我有两个手机:
1. 华为C8812,带SD卡,接上电脑之后显示有两个存储设备,而且识别为磁盘。当中。H盘是手机自带的,而I盘就是后来放进去的SD卡。
在程序中用了getExternalStorageDirectory()方法之后,发现hkapp目录的实际位置是在I盘,也就是SD卡上,OK,看上去这个getExternalStorageDirectory方法确实是获取了SD卡。而不是手机自带的存储。
2. 华为C8817,不带SD卡,接上电脑之后仅仅显示一个设备,而且,是作为设备总体来识别,而不单单是个磁盘。
在这个C8817上执行程序之前。我是有点小操心的,由于这个手机没有SD卡啊,会不会执行到一半报错呢?那么实际的情况是,确实报错了,但报的是没有权限訪问外部存储的错,于是也把权限加上去:
- <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
然后就想了,给了你权限又有什么用呢?反正你终究是没有SD卡在里面。必定要继续报错嘛。于是又一次执行,发现整个下载过程一切正常,没有报错。hkapp目录也正常建立了。但位置是在我原本以为的”内部存储“中,apk文件也顺利地进去了。
那么,到这里,有点错乱了,这个”getExternalStorageDirectory()“ 究竟是获取外部存储还是内部存储呢?
事实上这两个存储都是外部储存,真正的内部储存位置是data/data/包名
官方推荐 使用getExternalFilesDir(String)
or getExternalCacheDir()。
而且不须要申请权限
使用
getExternalFilesDir(String)
存储数据时候。系统在删除应用时,会把里面的数据也清楚,这种话,里面的内容就不会长期留在手机里。
Return the primary external storage directory. This directory may not currently be accessible if it has been mounted by the user on their computer, has been removed from the device, or some other problem has happened. You can determine its current state with getExternalStorageState()
.
Note: don't be confused by the word "external" here. This directory can better be thought as media/shared storage. It is a filesystem that can hold a relatively large amount of data and that is shared across all applications (does not enforce permissions).
Traditionally this is an SD card, but it may also be implemented as built-in storage in a device that is distinct from the protected internal storage and can be mounted as a filesystem on a computer.
On devices with multiple users (as described by UserManager
),
each user has their own isolated external storage. Applications only have access to the external storage for the user they're running as.
In devices with multiple "external" storage directories, this directory represents the "primary" external storage that the user will interact with. Access to secondary storage is available through
Applications should not directly use this top-level directory, in order to avoid polluting the user's root namespace. Any files that are private to the application should be placed in a directory returned byContext.getExternalFilesDir
,
which the system will take care of deleting if the application is uninstalled. Other shared files should be placed in one of the directories returned bygetExternalStoragePublicDirectory(String)
.
Writing to this path requires the WRITE_EXTERNAL_STORAGE
permission,
and starting in read access requires the READ_EXTERNAL_STORAGE
permission,
which is automatically granted if you hold the write permission.
Starting in KITKAT
,
if your application only needs to store internal data, consider using getExternalFilesDir(String)
or getExternalCacheDir()
,
which require no permissions to read or write.
This path may change between platform versions, so applications should only persist relative paths.
Android Environment.getExternalStorageDirectory() 获取的是内部存储还是外部存储?的更多相关文章
- Android Environment.getExternalStorageDirectory() 获取的是内部存储还是外部存储? - z
这几天在做Android应用的远程更新功能,将下载的更新包放在移动设备上指定的目录.用的是 Environment.getExternalStorageDirectory() 这个方法,然后在获取的 ...
- 彻底了解android中的内部存储与外部存储
我们先来考虑这样一个问题: 打开手机设置,选择应用管理,选择任意一个App,然后你会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的 ...
- 彻底理解android中的内部存储与外部存储
我们先来考虑这样一个问题: 打开手机设置,选择应用管理,选择任意一个App,然后你会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的 ...
- android中的文件操作详解以及内部存储和外部存储(转载)
原文链接:http://m.blog.csdn.net/article/details?id=17725989 摘要 其实安卓文件的操作和java在pc环境下的操作并无二致,之所以需要单独讲解是因为安 ...
- 【转】 android中的文件操作详解以及内部存储和外部存储
摘要 其实安卓文件的操作和Java在pc环境下的操作并无二致,之所以需要单独讲解是因为安卓系统提供了不同于pc的访问文件系统根路径的api,同时对一个应用的私有文件做了统一的管理.根据我的经验,初学者 ...
- 【转】彻底理解android中的内部存储与外部存储
我们先来考虑这样一个问题: 打开手机设置,选择应用管理,选择任意一个App,然后你会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的 ...
- android中的内部存储与外部存储
我们先来考虑这样一个问题: 打开手机设置,选择应用管理,选择任意一个App,然后你会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的 ...
- Android内存解析(二)— 详解内存,内部存储和外部存储
总述 觉得十分有必要搞清楚内存,内部存储和外部存储的区别,还有我们在开发中真正将数据存在了手机的哪儿. 先提一个问题:手机设置的应用管理中,每个App下都有清除数据和清除缓存,清除的分别是哪里的数据? ...
- Android数据存储之内部存储、外部存储
首先来介绍下什么是内部存储? 在Android平台下,有着自己独立的数据存储规则,在windows平台下,应用程序能够自由的或者在特定的訪问权限基础上訪问或改动其它应用程序下的文件资源. 可是在And ...
随机推荐
- bzoj 4242 水壶 (多源最短路+最小生成树+启发式合并)
4242: 水壶 Time Limit: 50 Sec Memory Limit: 512 MBSubmit: 1028 Solved: 261[Submit][Status][Discuss] ...
- with在模板中的应用
var str = 'Hello <%= name %>!'; var o = { name: 'Alice' }; function tmpl(str, obj) { str = 'va ...
- 全栈project师体能备战--知识面(1--10)
javascript 单例设计模式: 单例模式确保某个类仅仅有一个势力,并且自行实例化并向整个系统提供这个实例.如:cocos2dx中的导演类.[样例]我有6哥美丽的老婆,他们的老公都 ...
- what is a process?
A process is a program in execution. A process is more than the program code, which is sometimes kno ...
- datagrid在MVC中的运用02-结合搜索
本文接着上一篇,来体验给datagrid加上搜索功能.主要涉及到: ※ 把一个div与datagrid相关起来 ※ datagrid接收查询参数 ※ 查询参数的封装 效果图: 查询参数封装 分页相关的 ...
- QDAC
QDAC GITHUB: svn://www.qdac.cc/QDAC3 包括QMsgPack\QJson\QWoker...等序列和事件调度控件.
- python接口自动化5-Json数据处理
前言 有些post的请求参数是json格式的,这个前面第二篇post请求里面提到过,需要导入json模块处理. 一般常见的接口返回数据也是json格式的,我们在做判断时候,往往只需要提取其中几个关键的 ...
- 如何精简Unity中使用的字体文件
在游戏开发过程中,为了UI界面美观和显示效果一致性的考虑,大部分游戏都会使用动态字体来表现文字.尤其在这个看脸的时代,一种字体已经无法满足UI同学对美观的需求,因此我们常常发现若干个小则两三兆,大则十 ...
- POP数值动画
POP数值动画 效果 源码 https://github.com/YouXianMing/Animations // // PopNumberController.m // Animations // ...
- PHP SQL防注入
过年前后在做一个抽奖的东西,需要用户填写中奖信息,为了防止非法用户对数据库进行入侵神马的,于是写下基本的防注入语句,需要用的可以自己封装成一个function. $str = str_replace( ...