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卡操作的更多相关文章

  1. Android获取SD卡路径及SDCard内存的方法

    这篇文章主要介绍了Android获取SD卡路径及SDCard内存的方法,较为详细的分析了Android针对SD卡操作所涉及的类及其具体函数功能,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了A ...

  2. Android 检测SD卡应用

    Android 检测SD卡应用 //                                    Environment.MEDIA_MOUNTED // sd卡在手机上正常使用状态  // ...

  3. Android 获取SD卡路径和推断SD卡是否存在

    android获取sd卡路径方法: 不建议直接写死android sd卡的路径. public String getSDPath(){ File sdDir = null; boolean sdCar ...

  4. SD卡操作相关的工具SDCardUtils

    SD卡操作相关的工具 package com.flyou.utils; import java.io.File; import android.os.Environment; import andro ...

  5. Android获取SD卡路径/内存的几种方法

    Android获取SD卡路径 本篇将会带领大家学习如何获取android路径的几种常见用法,但在我开始bb之前需要大家清楚android中内存和外存之间的区别,下面进行简短介绍:android中的内存 ...

  6. WP8.1 Study12:文件压缩与Known Folder(包含SD卡操作)

    一.文件压缩 当应用程序保存和加载数据,它可以使用压缩. 1.使用 Windows.Storage.Compression.Compressor 压缩,获得一个Compressor stream. v ...

  7. Android 读写SD卡的文件

    今天介绍一下Android 读写SD卡的文件,要读写SD卡上的文件,首先需要判断是否存在SD卡,方法: Environment.getExternalStorageState().equals(Env ...

  8. android 向SD卡写入数据

    原文:android 向SD卡写入数据 1.代码: /** * 向sdcard中写入文件 * @param filename 文件名 * @param content 文件内容 */ public v ...

  9. android 读写sd卡的权限设置

    原文:android 读写sd卡的权限设置 在Android中,要模拟SD卡,要首先使用adb的mksdcard命令来建立SD卡的镜像,如何建立,大家上网查一下吧,应该很容易找到,这里不说这个问题. ...

随机推荐

  1. 「Vue」JS方法学习

    1.构造函数 大写开头的,能被NEW一个新实例,实例即执行回调函数 异步返回数据.then指定回调函数的时候,成功的回调函数必须传,失败的回调可以不传 var fs = require('fs') f ...

  2. Openstack 网络服务 Neutron计算节点部署(十)

    Neutron计算节点部署 安装组件,安装的服务器是192.168.137.12 1.安装软件包 yum install -y openstack-neutron-linuxbridge ebtabl ...

  3. saltstack主机管理项目【day23】:主机管理项目需求分析-设计

    本节内容 一. 主机管理项目需求分析 二 .主机管理项目架构设计 三.主机管理项目初始构建 四. 主机管理项目编主机分发器 一. 主机管理项目需求分析 场景:我现在又一台裸机要实现一下人物 配置管理: ...

  4. ★itext-为pdf文件添加页眉页脚 | 3步完成 |

    由于上一篇自定义生成pdf的功能需求又增加了,需要加上页码.所以本博客诞生了~ 1. 通过继承PdfPageEventHelper类,实现需要实现的方法 import com.lowagie.text ...

  5. python---django初步了解以及安装(包括Django网页首次无法访问的原因及解决方法,以及在linux服务器上布置无法启动的原因)

    pip install Django 相关网站资源: Python下有许多款不同的 Web 框架.Django是重量级选手中最有代表性的一位.许多成功的网站和APP都基于Django. Django是 ...

  6. Redis记录-Redis高级应用

    Redis数据库可以使用安全的方案,使得进行连接的任何客户端在执行命令之前都需要进行身份验证.要保护Redis安全,需要在配置文件中设置密码. 示例 下面的示例显示了保护Redis实例的步骤. 127 ...

  7. Java日期比较

    在进行业务处理时,遇到一个需要比较日期但是不包含时分秒的判断问题 SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd"); ...

  8. 20155303 2016-2017-2 《Java程序设计》课程总结

    20155303 2016-2017-2 <Java程序设计>课程总结 目录 一.每周作业及实验报告链接汇总 二.关于博客 自认为写得最好一篇博客是?为什么? 作业中阅读量最高的一篇博客是 ...

  9. Bug Bounty Reference

    https://github.com/ngalongc/bug-bounty-reference/blob/master/README.md#remote-code-execution Bug Bou ...

  10. 从xtrabackup备份恢复单表【转】

    目前对MySQL比较流行的备份方式有两种,一种上是使用自带的mysqldump,另一种是xtrabackup,对于数据时大的环境,普遍使用了xtrabackup+binlog进行全量或者增量备份,那么 ...