如果你的android设备有内部存储空间,即通常所说的机身存储(这就是指主要外部存储),那么你从外部插入SD卡就是一个二级外部存储设备

最新的Android 4.4系统中,外置存储卡(SD卡)被称为二级外部存储设备,新版本的API改进后应用程序已无法往外置存储卡(SD卡)的根目录写入数据。但若应用程序能够携带自己的包名并附加在根目录后面,即能在二级外部存储设备中创建、修 改、删除数据,如应用包名为 com.example.foo,则此应用即可以自由访问外部sdcard上的Android/data/com.example.foo/,且不需要申明权限,这个机制是由android系统包装的FUSE文件系统完成的。

另外,READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE只为设备上的主要外部存储(机身存储)授予写权限。

往同时含有主要外部存储及二级外部存储的android设备写入文件的步骤如下:

0、声明 READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE 两个权限

1、分别获取到 主要外部存储及二级外部存储 的根目录路径

2、判断当前设备是不是4.4(含)以后的版本,若为4.4(含)以后的版本则继续第3步,若为4.4以前的版本则将所有获取到的根目录传递给第4步

3、分别在这些根目录下创建一个文件名很怪异的文件,若有些根目录能创建成功(估计为主要外部存储)而有些根目录不能创建成功(估计为二级外部存储),先将创建成功了的文件删除掉,然后再将不能创建成功的根目录传递到第4步;若都能或都不能创建成功,先将创建成功了的文件删除掉,然后再将所有这些根目录传递给第4步

4、接收到传递过来的根目录路径后,分别在这些根目录里利用 mkdir -p 创建 Android/data/应用程序包名  目录,即可得到任意系统版本下均可供应用程序读写的目录。结束。

判断系统是否为4.4(含)以后的方法: 若 android.os.Build.VERSION.SDK_INT >= 19 为true则为4.4(含)以后的版本,否则为4.4以前的。

若为4.4以后版本的话机,则可简单使用以下的方法:

从4.4开始android已经支持多了sd卡(之前由厂商自己实现)

可通过以下方法获取

Context.getExternalFilesDirs(), 返回多个sd卡的该应用私有数据区的files目录

/storage/sdcard0/Android/data/<包名>/files

/storage/sdcard1/Android/data/<包名>/files

Context.getExternalCacheDirs(), 返回多个sd卡下该应用私有数据库的缓存目录

/storage/sdcard0/Android/data/<包名>/caches

/storage/sdcard1/Android/data/<包名>/caches

Context.getObbDirs(), 返回多个sd卡下obb目录下的私有数据

/storage/sdcard0/Android/obb/<包名>

/storage/sdcard1/Android/obb/<包名>

目前这些api在4.4以下的版本均为hide,需通过反射调用。

应用数据存储到sdcard上一定要规范,android4.4.2有新规范的更多相关文章

  1. Android数据存储:SDCard

    Android数据存储之SDCard 0.获取sd卡路径. 1.讲述 Environment 类. 2.讲述 StatFs 类. 3.完整例子读取 SDCard 内存 0.获取sd卡路径 方法一: p ...

  2. Android数据存储之Android 6.0运行时权限下文件存储的思考

    前言: 在我们做App开发的过程中基本上都会用到文件存储,所以文件存储对于我们来说是相当熟悉了,不过自从Android 6.0发布之后,基于运行时权限机制访问外置sdcard是需要动态申请权限,所以以 ...

  3. Android数据存储的三种方式:SharePreferences , file , SQLite

    (1)SharePreferences: 存入: SharedPreferences setter = this.getSharedPreferences("spfile", 0) ...

  4. android-exploitme(五):不安全的数据存储

    今天我来看看如果android将数据存储在sdcard,它的权限是什么样的 1. 打开emm软件,做一笔转账.

  5. 循序渐进VUE+Element 前端应用开发(27)--- 数据表的动态表单设计和数据存储

    在我们一些系统里面,有时候会需要一些让用户自定义的数据信息,一般这些可以使用扩展JSON进行存储,不过每个业务表的显示项目可能不一样,因此需要根据不同的表单进行设计,然后进行对应的数据存储.本篇随笔结 ...

  6. 第十一章:Android数据存储(上)

    数据和程序是应用构成的两个核心要素,数据存储永远是应用开发中最重要的主题之一,也是开发平台必须提供的基础功能.不光是在Android平台上,在其他的平台上,数据的存储永远是不可缺少的一块.Androi ...

  7. 【Android开发日记】之入门篇(七)——Android数据存储(上)

    在讲解Android的数据源组件——ContentProvider之前我觉得很有必要先弄清楚Android的数据结构. 数据和程序是应用构成的两个核心要素,数据存储永远是应用开发中最重要的主题之一,也 ...

  8. Android简单介绍SharedPreference,内部文件,sdcard数据存储

    SharedPreference 以xml的结构储存简单的数据,储存在data/data/程序包名/shared_prefs文件夹中 使用方式 创建对象的方式有三种 Context 的 getShar ...

  9. Ubuntu上更改MySQL数据库数据存储目录

    之前写过一篇博客"MySQL更改数据库数据存储目录",当时的测试环境是RHEL和CentOS,谁想最近在Ubuntu下面更改MySQL数据库数据存储目录时遇到了之前未遇到的问题,之 ...

随机推荐

  1. PHP优化杂烩

    讲 PHP 优化的文章往往都是教大家如何编写高效的代码,本文打算从另一个角度来讨论问题,教大家如何配置高效的环境,如此同样能够达到优化的目的. pool 一个让人沮丧的消息是绝大多数 PHP 程序员都 ...

  2. 学习webView控件使用

    WebView 对象用于网页显示使用,简单的学习并使用了一下. 1.首先在 layout 中摆一个全屏的 webview 控件 (main.xml ) <?xml version="1 ...

  3. Lotus Notes中编程发送邮件(二)

    在编程发送各种类似通知的邮件时,时常会需要发件人显示为某个特定的帐户,比如某个部门的名称或者管理员的名字.另一种需求是,用户收到某封邮件后,回复邮件的地址不同于发件人栏显示的地址.而正常情况下,发送邮 ...

  4. GetKeyState和GetAsyncKeyState以及GetKeyboardState函数的用法与区别2-------C#检查键盘大小写锁定状态

    1.命名空间:using System.Runtime.InteropServices;2.导入方法[DllImport("user32.dll", EntryPoint = &q ...

  5. [HDOJ3974]Assign the task(建树胡搞)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3974 出现在窝bin的线段树专题里…第一时间想的是记录入度找出根节点,然后标记深度转换到线段树中.但是 ...

  6. JPA中的@MappedSuperclass

    说明地址:http://docs.oracle.com/javaee/5/api/javax/persistence/MappedSuperclass.html 用来申明一个超类,继承这个类的子类映射 ...

  7. CodeForces Round #280 (Div.2)

    A. Vanya and Cubes 题意: 给你n个小方块,现在要搭一个金字塔,金字塔的第i层需要 个小方块,问这n个方块最多搭几层金字塔. 分析: 根据求和公式,有,按照规律直接加就行,直到超过n ...

  8. ElasticSearch Remote Code Execution (CVE-2014-3120)

    Elasticsearch is a powerful open source search and analytics engine. The vulnerability allows attack ...

  9. 用I/O口模拟IIC总线协议遇到的一些问题

    最近做的一个项目,是基于IIC总线通信的传感器系统.由于另外一个传感器使用的是类IIC协议,而不是标准IIC,所以MCU不能与其通信,最后没有办法,只有通过I/O口模拟的方式实现IIC的总线通信.具体 ...

  10. 入门视频采集与处理(学会分析YUV数据)

    做视频采集与处理,自然少不了要学会分析YUV数据.因为从采集的角度来说,一般的视频采集芯片输出的码流一般都是YUV数据流的形式,而从视频处理(例如H.264.MPEG视频编解码)的角度来说,也是在原始 ...