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卡的镜像,如何建立,大家上网查一下吧,应该很容易找到,这里不说这个问题. ...
随机推荐
- 「Vue」JS方法学习
1.构造函数 大写开头的,能被NEW一个新实例,实例即执行回调函数 异步返回数据.then指定回调函数的时候,成功的回调函数必须传,失败的回调可以不传 var fs = require('fs') f ...
- Openstack 网络服务 Neutron计算节点部署(十)
Neutron计算节点部署 安装组件,安装的服务器是192.168.137.12 1.安装软件包 yum install -y openstack-neutron-linuxbridge ebtabl ...
- saltstack主机管理项目【day23】:主机管理项目需求分析-设计
本节内容 一. 主机管理项目需求分析 二 .主机管理项目架构设计 三.主机管理项目初始构建 四. 主机管理项目编主机分发器 一. 主机管理项目需求分析 场景:我现在又一台裸机要实现一下人物 配置管理: ...
- ★itext-为pdf文件添加页眉页脚 | 3步完成 |
由于上一篇自定义生成pdf的功能需求又增加了,需要加上页码.所以本博客诞生了~ 1. 通过继承PdfPageEventHelper类,实现需要实现的方法 import com.lowagie.text ...
- python---django初步了解以及安装(包括Django网页首次无法访问的原因及解决方法,以及在linux服务器上布置无法启动的原因)
pip install Django 相关网站资源: Python下有许多款不同的 Web 框架.Django是重量级选手中最有代表性的一位.许多成功的网站和APP都基于Django. Django是 ...
- Redis记录-Redis高级应用
Redis数据库可以使用安全的方案,使得进行连接的任何客户端在执行命令之前都需要进行身份验证.要保护Redis安全,需要在配置文件中设置密码. 示例 下面的示例显示了保护Redis实例的步骤. 127 ...
- Java日期比较
在进行业务处理时,遇到一个需要比较日期但是不包含时分秒的判断问题 SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd"); ...
- 20155303 2016-2017-2 《Java程序设计》课程总结
20155303 2016-2017-2 <Java程序设计>课程总结 目录 一.每周作业及实验报告链接汇总 二.关于博客 自认为写得最好一篇博客是?为什么? 作业中阅读量最高的一篇博客是 ...
- Bug Bounty Reference
https://github.com/ngalongc/bug-bounty-reference/blob/master/README.md#remote-code-execution Bug Bou ...
- 从xtrabackup备份恢复单表【转】
目前对MySQL比较流行的备份方式有两种,一种上是使用自带的mysqldump,另一种是xtrabackup,对于数据时大的环境,普遍使用了xtrabackup+binlog进行全量或者增量备份,那么 ...