Android正确获取SD卡目录及使用SD卡目录
SD卡作为手机的扩展存储设备,在手机中充当硬盘角色,可以让我们手机存放更多的数据以及多媒体等大体积文件。因此查看SD卡的内存就跟我们查看硬盘的剩余空间一样,是我们经常操作的一件事,那么在Android开发中,我们如何能获取SD卡的内存容量呢?
1、判断手机是否插入SD卡
- if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
- doSth();
- //....
- }
2、然后才能操作SD卡
- File path = Environment.getExternalStorageDirectory();
这个PATH就是你要操作的路径,当然你在操作的时候最好对SD卡的使用做个检测判断,当SD卡有存储空间时才可以进行存储操作。
- StatFs statfs = new StatFs(path.getPath());
获取BLOCK的SIZE
- long blocSize = statfs.getBlockSize();
获取BLOCK数量
- long totalBlocks = statfs.getBlockCount();
空闲的Block的数量
- long availaBlock = statfs.getAvailableBlocks();
最后别忘了,要获取SD卡上面的信息,必须先对SD卡有访问的权限,因此最后一件事就是需要添加访问扩展设备的权限,更多权限请访问:Android 应用程序开发权限一览表。
- <uses-permission
- android:name="android.permission.WRITE_EXTERNAL_STORAGE">
- </uses-permission>
2、获得SD卡目录
1 | File sdCardDir = Environment.getExternalStorageDirectory(); //获取SDCard目录 |
3、写入文件
01 | File f = Environment.getExternalStorageDirectory(); //获取SD卡目录 |
02 | File fileDir = new File(f, "test.txt" ); |
03 | FileOutputStream os = new FileOutputStream(fileDir); |
04 | try { |
05 | os.write(text.getBytes()); |
06 | os.close(); |
07 | showToast( "保存到SD卡中" ); |
08 | } catch (IOException e) { |
09 | // TODO Auto-generated catch block |
10 | e.printStackTrace(); |
11 | } |
4、读取文件
01 | File f = Environment.getExternalStorageDirectory(); //获取SD卡目录 |
02 | File fileDir = new File(f, "test.txt" ); |
03 | is = new FileInputStream(fileDir); |
04 | ByteArrayOutputStream bos = new ByteArrayOutputStream(); |
05 | byte [] array = new byte [ 1024 ]; |
06 | int len = - 1 ; |
07 | while ( (len = is.read(array)) != - 1 ){ |
08 | bos.write(array, 0 ,len); |
09 | } |
10 | bos.close(); |
11 | is.close(); |
12 | return bos.toString(); |
5、读取权限
在AndroidManifest.xml中加入访问SDCard的权限如下:
<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
要往SDCard存放文件,程序必须先判断手机是否装有SDCard,并且可以进行读写。
6、其它方法
getCacheDir()方法用于获取/data/data/<package name>/cache目录。
getFilesDir()方法用于获取/data/data/<package name>/files目录。
其实就是普通的文件操作,不过还是有些地方需要注意。比如:
1.加入sdcard操作权限;
2.确认sdcard的存在;
3.不能直接在非sdcard的根目录创建文件,而是需要先创建目录,再创建文件;
在AndroidManifest.xml添加sdcard操作权限
<!-- sdcard权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">
</uses-permission>
变量声明:
private final static String PATH = "/sdcard/digu";
private final static String FILENAME = "/notes.txt";
向sdcard写文件
/**
* 写文件
*/
private void onWrite() {
try {
Log.d(LOG_TAG, "Start Write");
//1.判断是否存在sdcard
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
//目录
File path = new File(PATH);
//文件
File f = new File(PATH + FILENAME);
if(!path.exists()){
//2.创建目录,可以在应用启动的时候创建
path.mkdirs();
}
if (!f.exists()) {
//3.创建文件
f.createNewFile();
}
OutputStreamWriter osw = new OutputStreamWriter(
new FileOutputStream(f));
//4.写文件,从EditView获得文本值
osw.write(editor.getText().toString());
osw.close();
}
} catch (Exception e) {
Log.d(LOG_TAG, "file create error");
}
}
接着我们在使用SDcard进行读写的时候 会用到Environment类下面的几个静态方法
1: getDataDirectory() 获取到Androi中的data数据目录
2:getDownloadCacheDirectory() 获取到下载的缓存目录
3:getExternalStorageDirectory() 获取到外部存储的目录 一般指SDcard
4:getExternalStorageState() 获取外部设置的当前状态 一般指SDcard,
android系统中对于外部设置的状态,我们比较常用的应该是 MEDIA_MOUNTED(SDcard存在并且可以进行读写) MEDIA_MOUNTED_READ_ONLY (SDcard存在,只可以进行读操作) 当然还有其他的一些状态,可以在文档中进行查找到
5:getRootDirectory() 获取到Android Root路径
6:isExternalStorageEmulated() 返回Boolean值判断外部设置是否有效
7:isExternalStorageRemovable() 返回Boolean值,判断外部设置是否可以移除
【注】上面进行红色标记的方法,我们会常用
下面看实现SDCard进行文件读写操作的Demo:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class SDcardActivity extends Activity {
private Button bt1, bt2;
private EditText et1, et2;
private static final String FILENAME = "temp_file.txt";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
bt1 = (Button) this.findViewById(R.id.bt1);
bt2 = (Button) this.findViewById(R.id.bt2);
et1 = (EditText) this.findViewById(R.id.et1);
et2 = (EditText) this.findViewById(R.id.et2);
bt1.setOnClickListener( new MySetOnClickListener());
bt2.setOnClickListener( new MySetOnClickListener());
}
private class MySetOnClickListener implements OnClickListener {
@Override
public void onClick(View v) {
File file = new File(Environment.getExternalStorageDirectory(),
FILENAME);
switch (v.getId()) {
case R.id.bt1: // 使用SDcard写操作
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write(et1.getText().toString().getBytes());
fos.close();
Toast.makeText(SDcardActivity. this, "写入文件成功",
Toast.LENGTH_LONG).show();
} catch (Exception e) {
Toast.makeText(SDcardActivity. this, "写入文件失败",
Toast.LENGTH_SHORT).show();
}