Android开发中对读写SD的处理
2015-10-29 13:40
323 查看
Android开发中对读写SD的处理
众所周知,Android4.0以后的版本的sd卡有了内外之分。在2.x的版本中,在manifest中配置的权限android.permission.WRITE_EXTERNAL_STORAGE确实是用来使得sd卡获得写的权限。而在4.0开发的源码当中,由于有了内外置sd卡的区分。
android.permission.WRITE_EXTERNAL_STORAGE的权限用来设置了内置sd卡的写权限,如果在manifest中只是配置了这个权限,那个应用只能在内置sd卡中进行写操作,还是无法在外置sd卡中进行写操作。需要写外置sd卡的话,需要配置另一个权限android.permission.WRITE_MEDIA_STORAGE,这两个权限都被定义在android源码目录\frameworks\base\data\etc\platform.xml中:
<permission name="android.permission.WRITE_EXTERNAL_STORAGE" >
<group gid="sdcard_rw" />
</permission>
<permission name="android.permission.WRITE_MEDIA_STORAGE" >
<group gid="media_rw" />
</permission>
但是:android.permission.WRITE_MEDIA_STORAGE不让用
,原因大家都知道,因为那是系统权限。
在Android开发者网站的
"外部存储技术信息"文档中描述道 :
WRITE_EXTERNAL_STORAGE只为设备上的主要外部存储授予写权限,
,应用程序无法将数据写入二级外部存储设备,除非综合权限指定了应用程序的包目录。
目前只影响双存储设备,如果你的设备有内部存储空间,即通常所说的机身存储,那么你的SD卡就是一个二级外部存储设备。 在Android 4.4中,如果你同时使用了机身存储和SD卡, 那么应用程序将无法在SD卡中创建、修改、删除数据。比如,你无法使用酷我音乐盒下载保存Mp3到外置存储卡了,也无法使用快读免费小说将TXT版小说下载保存到外置存储卡了。但是应用程序仍然可以往主存储(机身存储)的任意目录中写入数据,不受任何限制。Google表示,
这样做的目的是,,通过这种方式进行限制,系统可以在应用程序被卸载后清除遗留文件。
解决方法:
从Android 1.0开始,写操作受权限WRITE_EXTERNAL_STORAGE保护。
从Android 4.1开始,读操作受权限READ_EXTERNAL_STORAGE保护。
从Android 4.4开始,应用可以管理在它外部存储上的特定包名目录,而不用获取WRITE_EXTERNAL_STORAGE权限。
比如,一个包名为com.example.foo的应用,可以自由访问外存上的Android/data/com.example.foo/目录。
外部存储对数据提供的保护较少,所以系统不应该存储敏感数据在外部存储上。
特别地,配置和log文件应该存储在内部存储中,这样它们可以被有效地保护。
getDataDirectory():用户数据目录。
getDownloadCacheDirectory():下载缓存内容目录。
getExternalStorageDirectory():主要的外部存储目录。
但是这个目录很可能当前不能访问,比如这个目录被用户的PC挂载,或者从设备中移除,或者其他问题发生,你可以通过getExternalStorageState()来获取当前状态。
为了不污染用户的根命名空间,一般不会直接使用这个外部存储的根目录。
任何应用私有的文件的应该被放置在 Context.getExternalFilesDir返回的目录下,在应用被卸载的时候,系统会清理的就是这个目录。
另一些共享文件应该被放置在
写这个路径需要
从KITKAT 即Android
4.4开始,如果你的应用只是需要存储一些内部数据,可以考虑使用 :
getExternalStoragePublicDirectory(String type)这个方法接收一个参数,表明目录所放的文件的类型,传入的参数是Environment类中的DIRECTORY_XXX静态变量,比如DIRECTORY_DCIM等。
注意:传入的类型参数不能是null,返回的目录路径有可能不存在,所以必须在使用之前确认一下,比如使用File.mkdirs创建该路径。
getRootDirectory()得到Android的根目录。
isExternalStorageEmulated()设备的外存是否是用内存模拟的,是则返回true。(API
Level 11)
isExternalStorageRemovable()设备的外存是否是可以拆卸的,比如SD卡,是则返回true。(API
Level 9)
getExternalFilesDir(String type)是应用在外部存储上的目录。
和Environment类的getExternalStoragePublicDirectory(String type)方法类似,返回包含参数指定的特定类型文件的子目录。
getExternalCacheDir()是应用的在外部存储上的缓存目录。
从Android 4.4这两个方法不需要读写权限,是针对于本应用来说,如果要访问其他应用的相关目录,还是需要声明读写权限。
注意:Android 4.4之前的版本要访问的话还是要声明读写权限的,如果没有在manifest中写权限,上面两个get方法都会返回null。
与上面两个方法形成对比的是下面两个方法:
getCacheDir();
这两个方法得到的是内存上的目录。
这些目录都是属于应用的,当应用被卸载的时候,里面的内容都会被移除,但是不要依赖于系统的操作。
众所周知,Android4.0以后的版本的sd卡有了内外之分。在2.x的版本中,在manifest中配置的权限android.permission.WRITE_EXTERNAL_STORAGE确实是用来使得sd卡获得写的权限。而在4.0开发的源码当中,由于有了内外置sd卡的区分。
android.permission.WRITE_EXTERNAL_STORAGE的权限用来设置了内置sd卡的写权限,如果在manifest中只是配置了这个权限,那个应用只能在内置sd卡中进行写操作,还是无法在外置sd卡中进行写操作。需要写外置sd卡的话,需要配置另一个权限android.permission.WRITE_MEDIA_STORAGE,这两个权限都被定义在android源码目录\frameworks\base\data\etc\platform.xml中:
<permission name="android.permission.WRITE_EXTERNAL_STORAGE" >
<group gid="sdcard_rw" />
</permission>
<permission name="android.permission.WRITE_MEDIA_STORAGE" >
<group gid="media_rw" />
</permission>
但是:android.permission.WRITE_MEDIA_STORAGE不让用
,原因大家都知道,因为那是系统权限。
在Android开发者网站的
"外部存储技术信息"文档中描述道 :
WRITE_EXTERNAL_STORAGE只为设备上的主要外部存储授予写权限,
,应用程序无法将数据写入二级外部存储设备,除非综合权限指定了应用程序的包目录。
目前只影响双存储设备,如果你的设备有内部存储空间,即通常所说的机身存储,那么你的SD卡就是一个二级外部存储设备。 在Android 4.4中,如果你同时使用了机身存储和SD卡, 那么应用程序将无法在SD卡中创建、修改、删除数据。比如,你无法使用酷我音乐盒下载保存Mp3到外置存储卡了,也无法使用快读免费小说将TXT版小说下载保存到外置存储卡了。但是应用程序仍然可以往主存储(机身存储)的任意目录中写入数据,不受任何限制。Google表示,
这样做的目的是,,通过这种方式进行限制,系统可以在应用程序被卸载后清除遗留文件。
解决方法:
访问外部存储的权限
从Android 1.0开始,写操作受权限WRITE_EXTERNAL_STORAGE保护。从Android 4.1开始,读操作受权限READ_EXTERNAL_STORAGE保护。
从Android 4.4开始,应用可以管理在它外部存储上的特定包名目录,而不用获取WRITE_EXTERNAL_STORAGE权限。
比如,一个包名为com.example.foo的应用,可以自由访问外存上的Android/data/com.example.foo/目录。
外部存储对数据提供的保护较少,所以系统不应该存储敏感数据在外部存储上。
特别地,配置和log文件应该存储在内部存储中,这样它们可以被有效地保护。
Environment API 介绍:
getDataDirectory():用户数据目录。getDownloadCacheDirectory():下载缓存内容目录。
getExternalStorageDirectory():主要的外部存储目录。
但是这个目录很可能当前不能访问,比如这个目录被用户的PC挂载,或者从设备中移除,或者其他问题发生,你可以通过getExternalStorageState()来获取当前状态。
为了不污染用户的根命名空间,一般不会直接使用这个外部存储的根目录。
任何应用私有的文件的应该被放置在 Context.getExternalFilesDir返回的目录下,在应用被卸载的时候,系统会清理的就是这个目录。
另一些共享文件应该被放置在
getExternalStoragePublicDirectory(String)返回的目录中。
写这个路径需要
WRITE_EXTERNAL_STORAGE权限,读需要
READ_EXTERNAL_STORAGE权限,当然写权限默认包含了读权限。
从KITKAT 即Android
4.4开始,如果你的应用只是需要存储一些内部数据,可以考虑使用 :
getExternalFilesDir(String)或者getExternalCacheDir(),它们不需要获取权限。
getExternalStoragePublicDirectory(String type)这个方法接收一个参数,表明目录所放的文件的类型,传入的参数是Environment类中的DIRECTORY_XXX静态变量,比如DIRECTORY_DCIM等。
注意:传入的类型参数不能是null,返回的目录路径有可能不存在,所以必须在使用之前确认一下,比如使用File.mkdirs创建该路径。
getRootDirectory()得到Android的根目录。
isExternalStorageEmulated()设备的外存是否是用内存模拟的,是则返回true。(API
Level 11)
isExternalStorageRemovable()设备的外存是否是可以拆卸的,比如SD卡,是则返回true。(API
Level 9)
Context API 介绍:
getExternalFilesDir(String type)是应用在外部存储上的目录。和Environment类的getExternalStoragePublicDirectory(String type)方法类似,返回包含参数指定的特定类型文件的子目录。
getExternalCacheDir()是应用的在外部存储上的缓存目录。
从Android 4.4这两个方法不需要读写权限,是针对于本应用来说,如果要访问其他应用的相关目录,还是需要声明读写权限。
注意:Android 4.4之前的版本要访问的话还是要声明读写权限的,如果没有在manifest中写权限,上面两个get方法都会返回null。
与上面两个方法形成对比的是下面两个方法:
getFilesDir();
getCacheDir();
这两个方法得到的是内存上的目录。
这些目录都是属于应用的,当应用被卸载的时候,里面的内容都会被移除,但是不要依赖于系统的操作。
相关文章推荐
- Android学习之防止按钮连续点击,打开多个相同activity
- 使用WakeLock使Android应用程序保持后台唤醒
- <学习笔记>ArcGIS Runtime for Android 10.2.5配置+baseMap
- ListView 嵌套 GridView 大法
- Android AlarmManager实现不间断轮询服务
- 初学android:四大组件之contentprovider
- Android:ListView 使用 viewholder 性能优化(Listview工作原理)
- BaseExpandableListAdapter分类绑定的实现
- Android学习之剪贴板操作
- scrollview自适应listview的四种方案
- 【FastDev4Android框架开发】AndroidAnnnotations注入框架使用之注入组件Components(九)
- android:scaleType属性
- android:descendantFocusability用法简析(listview的item点击无响应问题)
- android隐藏标题栏后影响样式的解决方案
- android studio 导入so文件出现的问题AND[android]复制 APK 许可证 (同一文件) 中的重复文件
- android模拟器root,avd root,emulator root教程
- Android编程实现的重力感应示例代码
- Android多媒体录制--MediaRecorder视频录制
- android布局属性详解
- Android学习之任务与返回栈