应用数据存储到sdcard上一定要规范,android4.4.2有新规范
如果你的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有新规范的更多相关文章
- Android数据存储:SDCard
Android数据存储之SDCard 0.获取sd卡路径. 1.讲述 Environment 类. 2.讲述 StatFs 类. 3.完整例子读取 SDCard 内存 0.获取sd卡路径 方法一: p ...
- Android数据存储之Android 6.0运行时权限下文件存储的思考
前言: 在我们做App开发的过程中基本上都会用到文件存储,所以文件存储对于我们来说是相当熟悉了,不过自从Android 6.0发布之后,基于运行时权限机制访问外置sdcard是需要动态申请权限,所以以 ...
- Android数据存储的三种方式:SharePreferences , file , SQLite
(1)SharePreferences: 存入: SharedPreferences setter = this.getSharedPreferences("spfile", 0) ...
- android-exploitme(五):不安全的数据存储
今天我来看看如果android将数据存储在sdcard,它的权限是什么样的 1. 打开emm软件,做一笔转账.
- 循序渐进VUE+Element 前端应用开发(27)--- 数据表的动态表单设计和数据存储
在我们一些系统里面,有时候会需要一些让用户自定义的数据信息,一般这些可以使用扩展JSON进行存储,不过每个业务表的显示项目可能不一样,因此需要根据不同的表单进行设计,然后进行对应的数据存储.本篇随笔结 ...
- 第十一章:Android数据存储(上)
数据和程序是应用构成的两个核心要素,数据存储永远是应用开发中最重要的主题之一,也是开发平台必须提供的基础功能.不光是在Android平台上,在其他的平台上,数据的存储永远是不可缺少的一块.Androi ...
- 【Android开发日记】之入门篇(七)——Android数据存储(上)
在讲解Android的数据源组件——ContentProvider之前我觉得很有必要先弄清楚Android的数据结构. 数据和程序是应用构成的两个核心要素,数据存储永远是应用开发中最重要的主题之一,也 ...
- Android简单介绍SharedPreference,内部文件,sdcard数据存储
SharedPreference 以xml的结构储存简单的数据,储存在data/data/程序包名/shared_prefs文件夹中 使用方式 创建对象的方式有三种 Context 的 getShar ...
- Ubuntu上更改MySQL数据库数据存储目录
之前写过一篇博客"MySQL更改数据库数据存储目录",当时的测试环境是RHEL和CentOS,谁想最近在Ubuntu下面更改MySQL数据库数据存储目录时遇到了之前未遇到的问题,之 ...
随机推荐
- C++ STL之排序算法
排序算法和查找算法差不多,也涉及到迭代器区间问题,关于该问题的注意事项就不在啰嗦了 一.全部排序sort.stable_sort sort是一种不稳定排序,使用时需要包含头文件algorithm 默认 ...
- BZOJ 1000: A+B Problem
问题:A + B问题 描述:http://acm.wust.edu.cn/problem.php?id=1000&soj=0 代码示例: import java.util.Scanner; p ...
- 异常:java.lang.UnsupportedOperationException: Manual close is not allowed over a Spring managed SqlSession
使用mybatis-3.2.2.jar + mybatis-spring-1.2.0.jar集成时,报以下异常: 15:42:48.538 [Thread-1] DEBUG o.s.b.f.s.Dis ...
- bzoj2242: [SDOI2011]计算器 && BSGS 算法
BSGS算法 给定y.z.p,计算满足yx mod p=z的最小非负整数x.p为质数(没法写数学公式,以下内容用心去感受吧) 设 x = i*m + j. 则 y^(j)≡z∗y^(-i*m)) (m ...
- UVa 11774 (置换 找规律) Doom's Day
我看大多数人的博客只说了一句:找规律得答案为(n + m) / gcd(n, m) 不过神题的题解还须神人写.. We can associate at each cell a base 3-numb ...
- [swustoj 771] 奶牛农场
奶牛农场 Description 将军有一个用栅栏围成的矩形农场和一只奶牛,在农场的一个角落放有一只矩形的箱子,有一天将军要出门,他就把奶牛用一根绳子套牢,然后将绳子的另一端绑到了那个箱子不靠栅栏的角 ...
- OK335xS dhcpcd porting
/********************************************************************** * OK335xS dhcpcd porting * 说 ...
- Java [Leetcode 337]House Robber III
题目描述: The thief has found himself a new place for his thievery again. There is only one entrance to ...
- 通过Instant Client包来使用SQL*PLUS
1.首先下载两个程序包: Instant Client Package - Basic(或Instant Client Package - Basic Lite)包 Instant Client Pa ...
- 【编程基础】const与#define的区别
[前言] 相信大家看别人代码的时候都遇到过,有人用#define定义,也有人用const定义. 那么两者的区别到底是什么呢?哪个更好用呢? 网上查了又查,下面总结一下. [总结] 编译器处理方式不同 ...