美文网首页Android 问题杂记
Android正确获取SD卡目录及使用SD卡目录

Android正确获取SD卡目录及使用SD卡目录

作者: sunny635533 | 来源:发表于2017-08-04 10:15 被阅读4729次

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

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

    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值,判断外部设置是否可以移除

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

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

    }

    相关文章

      网友评论

        本文标题:Android正确获取SD卡目录及使用SD卡目录

        本文链接:https://www.haomeiwen.com/subject/cxkvlxtx.html