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. jedisClient操作redis实现增删改查功能

    这个集群环境下和单机环境下: package com.taotao.sso.dao.impl; import org.springframework.beans.factory.annotation. ...

  2. python的面向对象-类的数据属性和实例的数据属性相结合-无命名看你懵逼不懵逼系列

    1. class Chinese: country='China' def __init__(self,name): self.name=name def play_ball(self,ball): ...

  3. C语言扫盲篇

    C语言扫盲篇 作者:尹正杰 版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接. 一.什么是C语言 C 语言是一种通用的高级语言,最初是由 ...

  4. openstack项目【day23】:虚拟化介绍

    本节内容 一 什么是虚拟化 二 为何要学习虚拟化 三 虚拟化技术主要分类(了解) 四 平台虚拟化技术又可以细分(了解) 一 什么是虚拟化 虚拟化说白了就是本来是一个完整的资源,切分或者说虚拟成多份,让 ...

  5. ThinkPHP框架学习(一)

    这几天呢,断断续续地在看孙叔华老师的ThinkPHP教程,期间还做了一些其他事情,出去办了点事,总结总结下一学期规划等等,不知不觉间又过去了大半个星期.现在呢,看完了一天的教程,在这里,还是希望稍微总 ...

  6. JIRA项目管理搭建

    部署JIRA 7.2.2 for Linux 转自:http://www.yfshare.vip/2017/05/09/%E9%83%A8%E7%BD%B2JIRA-7-2-2-for-Linux/ ...

  7. Kafka 温故(四):Kafka的安装

    Step 1: 下载Kafka > tar -xzf kafka_2.9.2-0.8.1.1.tgz> cd kafka_2.9.2-0.8.1.1 Step 2: 启动服务Kafka用到 ...

  8. ASP.NET MVC学习笔记-----ControllerFactory

    上面这张图是asp.net mvc的工作流程图,我们可以看到当一个http请求来临时,首先需要经过路由系统,路由系统从中获取一些路由信息,然后ControllerFactory根据所得到的路由信息生成 ...

  9. ASP.NET保存信息总结(Application、Session、Cookie、ViewState和Cache等)

    以下是关于ASP.NET中保存各种信息的对象的比较,理解这些对象的原理,对制作完善的程序来说是相当有必要的(摘至互联网,并非原创--xukunping) 在ASP.NET中,有很多种保存信息的对象.例 ...

  10. 20155211 2016-2017-2 《Java程序设计》第六周学习总结

    20155211 2016-2017-2 <Java程序设计>第六周学习总结 教材学习内容总结 第十章 输入/输出 一.InputStream与OutputStream (一)串流设计的概 ...