Android Environment.getExternalStorageDirectory() 获取的是内部存储还是外部存储?

这几天在做Android应用的远程更新功能,将下载的更新包放在移动设备上指定的文件夹。

用的是  Environment.getExternalStorageDirectory() 这种方法。然后在获取的文件夹中新建一个hkapp文件夹,用来存放下载的apk文件。

那么,这个hkapp文件究竟是在那块存储区域呢?

一開始,看看网上的API,已经这种方法的字面意思。想当然地以为它就是获取SD卡上的文件夹,而不是手机的内部存储。

当然。除了望文生义之外,似乎还有确凿的证据支持我的观点。那就是在执行的时候报错,提示权限不足,也就是要配置訪问外部存储的权限:

[html] view
plain
 copy

  1. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
  2. <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卡啊,会不会执行到一半报错呢?那么实际的情况是,确实报错了,但报的是没有权限訪问外部存储的错,于是也把权限加上去:

[html] view
plain
 copy

  1. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
  2. <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.

时间: 2024-10-12 20:31:32

Android Environment.getExternalStorageDirectory() 获取的是内部存储还是外部存储?的相关文章

彻底理解android中的内部存储与外部存储

我们先来考虑这样一个问题: 打开手机设置,选择应用管理,选择任意一个App,然后你会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的时候又是清除的哪里的数据?读完本文相信你会有答案. 在android开发中我们常常听到这样几个概念,内存,内部存储,外部存储,很多人常常将这三个东西搞混,那么我们今天就先来详细说说这三个东西是怎么回事? 内存,我们在英文中称作memory,内部存储,我们称为InternalStorage,外部存储我

【转】 android中的文件操作详解以及内部存储和外部存储

摘要 其实安卓文件的操作和Java在pc环境下的操作并无二致,之所以需要单独讲解是因为安卓系统提供了不同于pc的访问文件系统根路径的api,同时对一个应用的私有文件做了统一的管理.根据我的经验,初学者在这部分感到很容易混淆内部存储和外部存储两个概念. 相对 其实安卓文件的操作和java在pc环境下的操作并无二致,之所以需要单独讲解是因为安卓系统提供了不同于pc的访问文件系统根路径的api,同时对一个应用的私有文件做了统一的管理.根据我的经验,初学者在这部分感到很容易混淆内部存储和外部存储两个概念

android中的文件操作详解以及内部存储和外部存储(转载)

原文链接:http://m.blog.csdn.net/article/details?id=17725989 摘要 其实安卓文件的操作和java在pc环境下的操作并无二致,之所以需要单独讲解是因为安卓系统提供了不同于pc的访问文件系统根路径的api,同时对一个应用的私有文件做了统一的管理.根据我的经验,初学者在这部分感到很容易混淆内部存储和外部存储两个概念. 相对 其实安卓文件的操作和java在pc环境下的操作并无二致,之所以需要单独讲解是因为安卓系统提供了不同于pc的访问文件系统根路径的ap

Android中的内部存储与外部存储

http://www.androidchina.net/4106.html 1.内部存储 data文件夹就是我们常说的内部存储,当我们打开data文件夹之后(没有root的手机不能打开该文件夹),里边有两个文件夹值得我们关注,如下: 一个文件夹是app文件夹,还有一个文件夹就是data文件夹,app文件夹里存放着我们所有安装的app的apk文件,其实,当我们调试一个app的时候,可以看到控制台输出的内容,有一项是uploading -..就是上传我们的apk到这个文件夹,上传成功之后才开始安装.

android内部存储与外部存储理解

我们先来考虑这样一个问题: 打开手机设置,选择应用管理,选择任意一个App,然后你会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的时候又是清除的哪里的数据?读完本文相信你会有答案. 在android开发中我们常常听到这样几个概念,内存,内部存储,外部存储,很多人常常将这三个东西搞混,那么我们今天就先来详细说说这三个东西是怎么回事? 内存,我们在英文中称作memory,内部存储,我们称为InternalStorage,外部存储我

android内部存储与外部存储

存储在内部还是外部 所有的Android设备均有两个文件存储区域:"internal" 与 "external" . 这两个名称来自于早先的Android系统,当时大多设备都内置了不可变的(internal storage)及一个类似于SD card这样的可卸载的存储部件(external storage).之后有一些设备将"internal" 与 "external" 都做成了不可卸载的内置存储,虽然如此,但是这一整块还是从

Android内存解析(二)— 详解内存,内部存储和外部存储

总述 觉得十分有必要搞清楚内存,内部存储和外部存储的区别,还有我们在开发中真正将数据存在了手机的哪儿. 先提一个问题:手机设置的应用管理中,每个App下都有清除数据和清除缓存,清除的分别是哪里的数据? 一   内存,内部存储和外部存储 1. 可对Android手机存储空间做如下划分: 整个存储空间分为内部存储和外部存储两部分,内部存储中又包含RAM和ROM等部分. 2. 具体概念区分 内部存储,即InternalStorage,也常说内置存储卡,这是手机内置的存储空间,出厂时就被确定,是手机的一

android数据存储_外部存储

源码下载(免下载积分):下载 外部存储并不是一定可以访问的,例如外部存储挂载到电脑上是,或者是SD Card作为外部存储,被移除是,因此在访问外部存储时,一定要保证外部存储是可以获得的.判断外部存储是否已经挂载到了手机上可以这样判断: //判断外部存储是否可以访问,并且可以读写 private boolean isExternalStorageWritable() { String state = Environment.getExternalStorageState(); if (Enviro

Android数据存储之内部存储、外部存储

首先来介绍下什么是内部存储? 在Android平台下,有着自己独立的数据存储规则,在windows平台下,应用程序可以自由的或者在特定的访问权限基础上访问或修改其他应用程序下的文件资源. 但是在Android平台下,一个应用程序所有的数据都是对外私有的,只有应用程序自己本身才可以访问. 当应用程序被安装到系统中后,其所在的包会有一个文件夹用于存放自己的数据,只有这个应用程序才有对这个文件夹的写入权限,这个私有的数据文件位于Android/data/data目录下. 读取内部数据可以使用openF