android 获取sd卡目录失败_Android正确获取SD卡目录及使用SD卡目录

此文乃是转载,原文在这里链接

SD卡作为手机的扩展存储设备,在手机中充当硬盘角色,可以让我们手机存放更多的数据以及多媒体等大体积文件。因此查看SD卡的内存就跟我们查看硬盘的剩余空间一样,是我们经常操作的一件事,那么在Android开发中,我们如何能获取SD卡的内存容量呢?

1、判断手机是否插入SD卡

Java代码

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){

doSth();

//....

}

2、然后才能操作SD卡

File path = Environment.getExternalStorageDirectory();

这个PATH就是你要操作的路径,当然你在操作的时候最好对SD卡的使用做个检测判断,当SD卡有存储空间时才可以进行存储操作。

StatFs statfs =newStatFs(path.getPath());

获取BLOCK的SIZE

longblocSize = statfs.getBlockSize();

获取BLOCK数量

longtotalBlocks = statfs.getBlockCount()

空闲的Block的数量

longavailaBlock = statfs.getAvailableBlocks();

最后别忘了,要获取SD卡上面的信息,必须先对SD卡有访问的权限,因此最后一件事就是需要添加访问扩展设备的权限,更多权限请访问:Android 应用程序开发权限一览表。

XML/HTML代码

android:name="android.permission.WRITE_EXTERNAL_STORAGE">

2、获得SD卡目录

sdCardDir = Environment.getExternalStorageDirectory();//获取SDCard目录

3、写入文件

File f = Environment.getExternalStorageDirectory();//获取SD卡目录

File fileDir =newFile(f,"test.txt");

FileOutputStream os =newFileOutputStream(fileDir);

try{

os.write(text.getBytes());

os.close();

showToast("保存到SD卡中");

}catch(IOException

e) {

//

TODO Auto-generated catch block

e.printStackTrace();

}

4、读取文件

File f = Environment.getExternalStorageDirectory();//获取SD卡目录

File fileDir =newFile(f,"test.txt");

is =newFileInputStream(fileDir);

ByteArrayOutputStream bos =newByteArrayOutputStream();

byte[] array =newbyte[1024];

intlen = -1;

while(

(len = is.read(array)) != -1){

bos.write(array,0,len);

}

bos.close();

is.close();

returnbos.toString();

5、读取权限

在AndroidManifest.xml中加入访问SDCard的权限如下:

要往SDCard存放文件,程序必须先判断手机是否装有SDCard,并且可以进行读写。

6、其它方法

getCacheDir()方法用于获取/data/data//cache目录。

getFilesDir()方法用于获取/data/data//files目录。

其实就是普通的文件操作,不过还是有些地方需要注意。比如:

1.加入sdcard操作权限;

2.确认sdcard的存在;

3.不能直接在非sdcard的根目录创建文件,而是需要先创建目录,再创建文件;

在AndroidManifest.xml添加sdcard操作权限

变量声明:

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()  获取到下载的缓存目录

4:getExternalStorageState() 获取外部设置的当前状态 一般指SDcard,

android系统中对于外部设置的状态,我们比较常用的应该是MEDIA_MOUNTED(SDcard存在并且可以进行读写)MEDIA_MOUNTED_READ_ONLY(SDcard存在,只可以进行读操作)  当然还有其他的一些状态,可以在文档中进行查找到

5:getRootDirectory()  获取到Android Root路径

6:isExternalStorageEmulated() 返回Boolean值判断外部设置是否有效

7:isExternalStorageRemovable()  返回Boolean值,判断外部设置是否可以移除

【注】上面进行红色标记的方法,我们会常用

Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)  代码中这句:我们对SDcard的状态进行判断,

下面看实现SDCard进行文件读写操作的Demo:

packagecom.jiangqq.sdcard;

importjava.io.File;

importjava.io.FileInputStream;

importjava.io.FileOutputStream;

importandroid.app.Activity;

importandroid.content.Context;

importandroid.os.Bundle;

importandroid.os.Environment;

importandroid.view.View;

importandroid.view.View.OnClickListener;

importandroid.widget.Button;

importandroid.widget.EditText;

importandroid.widget.Toast;

publicclassSDcardActivityextendsActivity {

privateButton bt1, bt2;

privateEditText et1, et2;

privatestaticfinalString FILENAME = "temp_file.txt";

@Override

publicvoidonCreate(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(newMySetOnClickListener());

bt2.setOnClickListener(newMySetOnClickListener());

}

privateclassMySetOnClickListenerimplementsOnClickListener {

@Override

publicvoidonClick(View v) {

File file =newFile(Environment.getExternalStorageDirectory(),

FILENAME);

switch(v.getId()) {

caseR.id.bt1://使用SDcard写操作

if(Environment.getExternalStorageState().equals(

Environment.MEDIA_MOUNTED)) {

try{

FileOutputStream fos =newFileOutputStream(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();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值