sd卡的访问
一般再访问sd卡前都要获取sd卡的路径,以防止不同的厂商有不同的路径配置。Android提供了Environment类来获取系统当前sd卡路径。
Log.d(TAG, Environment.getExternalStorageDirectory().getAbsolutePath());
以手上的三星手机为例,打印出来的结果是
533 09-20 14:29:47.850 D 32105 32105 sdtest : /storage/emulated/0
adb shell连上手机确认下路径
root@degasveltechn:/proc/32105 # cat mounts
cat mounts
...
/dev/block/platform/soc.2/by-name/USER /data ext4 rw,seclabel,nosuid,nodev,noatime,discard,journal_checksum,journal_asyn
c_commit,noauto_da_alloc,data=ordered 0 0
...
/data/media /storage/emulated/0 sdcardfs rw,nosuid,nodev,relatime,uid=1023,gid=1023,derive=legacy,reserved=20MB 0 0
/storage/emulated/0 目录是以sdcardfs方式挂载到目录/data/media,/data目录是系统目录,由此可见
Environment.getExternalStorageDirectory()
获取到的是机身内部SD卡的地址,并不是真正外部SD卡的地址。android系统是区分内部SD卡和外部SD卡两种,一般内部SD卡是内部ROM存储空间的一部分切割出来的,逻辑的意义大于物理。
当我们想用如下方法访问SD卡的时候
File sd = new File(Environment.getExternalStorageDirectory(), "text.txt");
try {
sd.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
会发现再createNewFile()的时候程序抛出了一个IO异常,系统调用open的时候被返回EACCES文件访问权限错误了。
1036 09-20 14:46:28.850 W 32368 32368 System.err: java.io.IOException: open failed: EACCES (Permission denied)
1037 09-20 14:46:28.850 W 32368 32368 System.err: at java.io.File.createNewFile(File.java:946)
1053 09-20 14:46:28.850 W 32368 32368 System.err: Caused by: libcore.io.ErrnoException: open failed: EACCES (Permission denied
因为我们没有在AndroidManifest.xml里面加入权限使用的声明
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Android对于SD卡目录的访问权限限制并不是直接通过控制linux内核文件权限rwx标志位来限制应用访问,而是间接通过package management service控制一个文件
/data/system/packages.list
来实现,我们先看下未加入uses-permission声明的时候,该文件的内容是什么
cat /data/system/packages.list | grep sdtest
com.example.sdtest 10155 1 /data/data/com.example.sdtest default none
当前拥有的组权限是none,再增加了user-permission声明之后,再看文件内容变成了
cat /data/system/packages.list | grep sdtest
com.example.sdtest 10155 1 /data/data/com.example.sdtest default 1028,1015
新增了1028和1015组权限。
而1028正好是sdcard_r,因而就间接拥有了SD卡的访问权限。
sd卡的访问的更多相关文章
- android 读取SD卡文件
SD卡作为手机的扩展存储设备,在手机中充当硬盘角色,可以让我们手机存放更多的数据以及多媒体等大体积文件.因此查看SD卡的内存就跟我们查看硬盘的剩余空间一样,是我们经常操作的一件事,那么在Android ...
- 【译】如何在 Android 5.0 上获取 SD卡 的读写权限
因为最近项目需要,涉及到 SD卡 的读写操作,然而申请 <!-- 读写权限 --> <uses-permission android:name="android.permi ...
- 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)
1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...
- system权限无法访问外挂SD卡
总结Android应用system权限无法访问SD卡问题 包括android1.6 解决方案http://hi.baidu.com/yunlongchn/item/7d6636d8547317ffca ...
- SD卡之二:SD总线访问模式
SD 卡是以命令.回应.数据流进行通讯. 1.命令:命令的长度是48位,命令以'0'开始,第2位为'1'表示主机发往SD卡的命令,最后以CRC和结束位'1'结尾. 2.回应:回应的长度是48位或者13 ...
- RAM、DRAM、SD卡
catalogue . ROM.RAM.DRAM.SRAM和FLASH的区别 . 内存工作原理 . DRAM基本结构与原理 . SD卡基本结构与原理 1. ROM.RAM.DRAM.SRAM和FLAS ...
- Android 数据库SQLite 写入SD卡
如果手机没有root,数据库文件是无法查看到的,不方便调试. 最好的办法是把数据库写进SD卡. 修改的地方有两处: 1.在你的helper类中把数据库文件名称 DATABASE_NAME 由原来的一个 ...
- Android中使用SQLiteOpenHelper管理SD卡中的数据库
使用Android中自带的SQLiteOpenHelper可以完成数据库的创建与管理,但有两点局限: (1)数据库创建在内存卡中,大小受限,创建位置位于/data/data/应用程序名/databas ...
- sd 卡驱动--基于高通平台
点击打开链接 内容来自以下博客: http://blog.csdn.net/qianjin0703/article/details/5918041 Linux设备驱动子系统第二弹 - SD卡 (有介绍 ...
随机推荐
- PostFix支持SMTP认证
安装cyrus-sasl yum -y install cyrus-sasl* 启动服务,开机启动 service saslauthd start chkconfig saslauthd on 配置p ...
- jieba结巴分词
pip install jieba安装jieba模块 如果网速比较慢,可以使用豆瓣的Python源:pip install -i https://pypi.douban.com/simple/ jie ...
- CentOS安装nmon
nmon官网: http://nmon.sourceforge.net/pmwiki.php?n=Main.HomePage 下载nmon16e_mpginc.tar.gz到本地并上传到服务器 tar ...
- [转]JS私有化的实现——稳妥构造函数
所谓稳妥对象, 指的是没有公共属性, 而且其方法也不引用this的对象.稳妥对象函数遵循与寄生构造函数类似的模式, 但有两点不同: 一是新创建对象的实例方法不引用this: 二是不使用new操作符调用 ...
- Maya Api笔记 - How polygons are handled internally
为加深记忆和理解Maya的Polygon,尝试利用空闲时间翻译Maya Api文档相关章节. How polygons are handled internally - 多边形是如何在内部处理的
- 【Python+OpenCV】人脸识别基于环境Windows+Python3 version_3(Anaconda3)+OpenCV3.4.3安装配置最新版安装配置教程
注:本次安装因为我要安装的是win10(64bit)python3.7与OpenCV3.4.3教程(当下最新版,记录下时间2018-11-17),实际中这个教程的方法对于win10,32位又或是64位 ...
- leetcode-颜色分类
颜色分类 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 0. 1 和 2 分别表示 ...
- 《Git学习指南》学习笔记(一)
第二章 入门 git的安装 在Linux下,git的安装很简单.以我的系统Deepin/Ubuntu为例,只需在终端敲入sudo apt-get install git即可.其他Linux发行版可尝试 ...
- 【MySQL解惑笔记】忘记MySQL数据库密码
破解MySQL密码 一.MySQL5.7.5之前 只要有系统root密码就可以破解: [root@host- ~]# vim /etc/my.cnf //在配置文件中加入如下内容 [mysqld] s ...
- 今日头条 2018 AI Camp 5 月 26 日在线笔试编程题第二道——最小分割分数
题目: 给 n 个正整数 a_1,…,a_n, 将 n 个数顺序排成一列后分割成 m 段,每一段的分数被记为这段内所有数的和,该次分割的分数被记为 m 段分数的最大值.问所有分割方案中分割分数的最小值 ...