Android 常见SD卡操作
Android 常见SD卡操作
参考
https://blog.csdn.net/mad1989/article/details/37568667.
【0.】 Environment 类SD卡相关方法
Method | Description |
---|---|
getExternalStoragePublicDirectory(String type) | 获取指定类型的目录 |
getExternalStorageState() | 获取SD卡的状态 |
getExternalStorageDirectory() | 获取SD卡的根目录 |
getExternalStorageState(File path) | 获取指定文件的状态 |
【1.】 检测SD卡是否可用
String sdCardState = Environment.getExternalStorageState();
if (sdCardState.equals(Environment.MEDIA_MOUNTED)) {
L.e("SD Card is available!");
} else {
L.e("SD Card is unavailable!");
}
【2.】 获取SD卡的空间
/**
* 获取SD卡的大小
*/
public void getSDCardSize(View view) {
File sdCard = Environment.getExternalStorageDirectory();
//获取SD卡的可用大小
//sdCard.getFreeSpace();
//getUsableSpace 要比getFreeSpace精确一些
long lFree = sdCard.getUsableSpace();
//获取SD开的总大小
long totalSize = sdCard.getTotalSpace();
//格式化,Formatter类,会自动地将大小转化为合适的单位
String total = android.text.format.Formatter.formatFileSize(this, totalSize);
String free = android.text.format.Formatter.formatFileSize(this, lFree);
L.e(MessageFormat.format("Sad Card Info 【Total Size】= {0} 【Free Size】={1}", total, free));
}
【3.】 SD卡的操作权限
在manifests
文件中加入SD权限
<!--写入SD卡权限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
申请权限
private static final int WRITE_SD_CARD_REQUEST_CODE = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sdcard);
int state = ActivityCompat.checkSelfPermission
(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (state != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(
this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
WRITE_SD_CARD_REQUEST_CODE);
}
}
//处理权限的申请结果
@Override
public void onRequestPermissionsResult
(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == WRITE_SD_CARD_REQUESTCODE) {
//如果拒绝了权限,结束Activity
if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
this.finish();
} else {
L.e("具有权限");
}
}
}
【4.】绕过权限访问向SD卡中写入数据
有时候,我们需要向SD卡中存储一些缓存数据,但是这时候如果申请读写SD卡权限的话似乎也不太必要,那么你可通过下面的这个方法向SD卡中写入数据。
文件的存储路径为: storage/sdcard/Android/data/应用程序包名/cache/
/**
* 绕过权限先SD卡中写入数据
*/
public void writeCacheData(View view) throws IOException {
//获得SD卡中写入
//获取到本应用程序在SD卡中的的缓存目录
File cacheFileDir = this.getExternalCacheDir();
File file = new File(cacheFileDir, "temp.txt");
FileOutputStream fileOutputStream = new FileOutputStream(file);
fileOutputStream.write("Hello World!".getBytes("UTF-8"));
fileOutputStream.flush();
fileOutputStream.close();
//将刚刚写入的信息读取出来
File readFile = new File(cacheFileDir, "temp.txt");
FileInputStream fileInputStream = new FileInputStream(readFile);
StringBuilder builder = new StringBuilder();
int i;
while ((i = fileInputStream.read()) != -1)
builder.append((char) i);
L.e(builder.toString());
fileInputStream.close();
}
【5.】向SD卡中写入数据
众所周知SD卡下面有许多不同的目录用来放置不同的类型的文件,比如说Download目录
,Movies目录
等等。
我们可以通过Environment.getExternalStoragePublicDirectory(String type)
方法来获得不同的目录。
常见值如下:
Value | Description |
---|---|
DIRECTORY_MUSIC | 音乐目录 |
DIRECTORY_RINGTONES | 铃声 |
DIRECTORY_ALARMS | 闹钟 |
DIRECTORY_NOTIFICATIONS | 通知 |
DIRECTORY_PICTURES | 照片 |
DIRECTORY_MOVIES | 电影 |
DIRECTORY_DOWNLOADS | 下载 |
.... | ..... |
一个Demo,将照片保存到SD卡中
/**
* 向SD卡中写入数据
*/
public void writeImageIntoSDCard(View view) throws IOException {
//获取SD卡Picture路径
File picDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
File petFile = new File(picDir, "pet3.jpg");
//写入照片
FileOutputStream fileOutputStream = new FileOutputStream(petFile);
Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.pet3);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream);
fileOutputStream.flush();
fileOutputStream.close();
//如果仅仅是上面的代码是无法在图库中看到的,所以我们需要发送一个广播让系统来扫描SD卡
this.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(petFile)));
}
【6.】 从SD卡中读取数据
我想写入SD卡都会了的话,读取就更不是问题了,但是为了例子的完整性,还是写一个简单的例子吧。 将我们写入SD卡中的图片读取出来.
/**
* 从SD卡中读取图片
*/
public void readImageFromSDCard(View view) {
File picDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
File petFile = new File(picDir, "pet3.jpg");
Bitmap bitmap = BitmapFactory.decodeFile(petFile.getPath());
mPetIV.setImageBitmap(bitmap);
}
Android 常见SD卡操作的更多相关文章
- Android获取SD卡路径及SDCard内存的方法
这篇文章主要介绍了Android获取SD卡路径及SDCard内存的方法,较为详细的分析了Android针对SD卡操作所涉及的类及其具体函数功能,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了A ...
- Android 检测SD卡应用
Android 检测SD卡应用 // Environment.MEDIA_MOUNTED // sd卡在手机上正常使用状态 // ...
- Android 获取SD卡路径和推断SD卡是否存在
android获取sd卡路径方法: 不建议直接写死android sd卡的路径. public String getSDPath(){ File sdDir = null; boolean sdCar ...
- SD卡操作相关的工具SDCardUtils
SD卡操作相关的工具 package com.flyou.utils; import java.io.File; import android.os.Environment; import andro ...
- Android获取SD卡路径/内存的几种方法
Android获取SD卡路径 本篇将会带领大家学习如何获取android路径的几种常见用法,但在我开始bb之前需要大家清楚android中内存和外存之间的区别,下面进行简短介绍:android中的内存 ...
- WP8.1 Study12:文件压缩与Known Folder(包含SD卡操作)
一.文件压缩 当应用程序保存和加载数据,它可以使用压缩. 1.使用 Windows.Storage.Compression.Compressor 压缩,获得一个Compressor stream. v ...
- Android 读写SD卡的文件
今天介绍一下Android 读写SD卡的文件,要读写SD卡上的文件,首先需要判断是否存在SD卡,方法: Environment.getExternalStorageState().equals(Env ...
- android 向SD卡写入数据
原文:android 向SD卡写入数据 1.代码: /** * 向sdcard中写入文件 * @param filename 文件名 * @param content 文件内容 */ public v ...
- android 读写sd卡的权限设置
原文:android 读写sd卡的权限设置 在Android中,要模拟SD卡,要首先使用adb的mksdcard命令来建立SD卡的镜像,如何建立,大家上网查一下吧,应该很容易找到,这里不说这个问题. ...
随机推荐
- sking
#include #include #include typedef struct SKI{ int data; int x; int y; char flag; int len; }STSKI; i ...
- 关闭ubuntu dash 方法
因为ubuntu默认的sh是连接到dash的,又因为dash跟bash的不兼容所以出错了.执行时可以把sh换成bash 文件名.sh来执行.成功.dash是什么东西,查了一下,应该也是一种shell, ...
- Flink窗口介绍及应用
Windows是Flink流计算的核心,本文将概括的介绍几种窗口的概念,重点只放在窗口的应用上. 本实验的数据采用自拟电影评分数据(userId, movieId, rating, timestamp ...
- Java基础-变量的定义以及作用域详解
Java基础-变量的定义以及作用域详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.字面量 常量(字面量)表示不能改变的数值(程序中直接出现的值).字面量有时也称为直接量,包 ...
- [六字真言]6.吽.SpringMVC中上传大小异常填坑
最近在讲课的时候,遇到了关于上传文件过大的时候浏览器无法响应的问题,配置了捕获异常,有的学生浏览器好使,有的学生浏览器不好用!莫名其妙! MaxUploadSizeExceededException进 ...
- SQL Server 基础之《学生表-教师表-课程表-选课表》(二)
表结构 --学生表tblStudent(编号StuId.姓名StuName.年龄StuAge.性别StuSex) --课程表tblCourse(课程编号CourseId.课程名称CourseName. ...
- Xcode多种Build Configuration配置使用
Build Configuration? Xcode默认会有2个编译模式,一个是Debug,一个是Release.Release下不能调试程序,编译时有做编译优化,会比用Debug打包出来的运行快,另 ...
- ZYNQ. LwIP.PHY.KSZ9031RNX
新一块板子 米尔科技的 z-turn 使用的PHY芯片是Micrel的 KSZ9031RNX 而不是zedboard上的Marvell的. 直接使用lwip的echo server demo时会报错 ...
- 无法在线安装Genymotion Eclipse插件,显示”There are no categoryzed items“
去掉对“Group items by category"的勾选.
- 洛谷 P3320: bzoj 3991: LOJ 2182: [SDOI2015]寻宝游戏
题目传送门:LOJ #2182. 题意简述: 一棵 \(n\) 个节点的树,边有边权. 每个点可能是关键点,每次操作改变一个点是否是关键点. 求所有关键点形成的极小联通子树的边权和的两倍. 题解: 有 ...