如果我们想要读取或者向SD卡写入,这时就必须先要判断一个SD卡的状态,否则有可能出错。

那么SD卡状态为什么时才能读取呢,经过我的各种情况的实践,大致如下:

SD状态

现象描述

/mnt/sdcard目录是否存在

canRead返回

canWrite返回

在/mnt/sdcard创建文件

在/mnt/sdcard创建文件夹


MEDIA_MOUNTED



SD卡正常挂载

TRUE

TRUE

TRUE

TRUE

TRUE


MEDIA_REMOVED



无介质

TRUE

FALSE

FALSE

false:  原因Permission denied

FALSE


MEDIA_UNMOUNTED



有介质,未挂载,在系统中删除

TRUE

FALSE

FALSE

false:  原因Permission denied

FALSE


MEDIA_BAD_REMOVAL



介质在挂载前被移除,直接取出SD卡

TRUE

FALSE

FALSE

false:  原因Permission denied

FALSE


MEDIA_CHECKING



正在磁盘检查,刚装上SD卡时

TRUE

FALSE

FALSE

false:  原因Permission denied

FALSE


MEDIA_SHARED



SD卡存在但没有挂载,并且通过USB大容量存储共享,操作打开USB存储

TRUE

FALSE

FALSE

false:  原因Permission denied

FALSE


MEDIA_MOUNTED_READ_ONLY



sd卡存在并且已挂载,但是挂载方式为只读



-

-


无法模拟,SD卡不允许修改权限



MEDIA_NOFS

介质存在但是为空白或用在不支持的文件系统



-

-


无法模拟,SD卡格式化后再加载会自动生成系统文件



MEDIA_UNMOUNTABLE

存在SD卡但是不能挂载,例如发生在介质损坏



-

-


无法模拟




通过上表可以看出,只有在SD卡状态为MEDIA_MOUNTED时/mnt/sdcard目录才是可读可写,并且可以创建目录及文件。

所以我们读取SD卡时一般会这么写:

String state;        
         String path;        
         state = Environment.getExternalStorageState();        
if(state.equals(Environment.MEDIA_MOUNTED)){
         path = Environment.getExternalStorageDirectory().getAbsolutePath();        
         }


读写SD卡记得加这两个权限:

<uses-permission Android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>


1 在AndroidManifest文件中加入sdcard操作权限
  * <!--在SDCard中创建与删除文件权限 -->
  * <uses-permissioandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> 
  * <!--往SDCard写入数据权限 --> 
  * <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
* 2 确认sdcard的存在
  * android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)
* 3 获取扩展存储设备的文件目录
  * android.os.Environment.getExternalStorageDirectory();

 

/

http://www.vogella.com/articles/Android/article.html#resources_android

http://www.coreservlets.com/android-tutorial/

这几天做一个功能需要在手机上创建一个文件夹,然后往里面存储一些文件,首先得考虑用户有没有sdcard,如果有就在sdcard上创建一个指定的文件夹,如果没有则在你的工程所在的目录“/data/data/你的包名”下创建文件夹。用到的方法是:


首先判断sdcard是否插入

String status = Environment.getExternalStorageState();
   if (status.equals(Environment.MEDIA_MOUNTED)) {
    return true;
   } else {
    return false;
   }


然后根据是否插入状态指定目录

if (SdcardHelper.isHasSdcard()) {
    sDir = SDCARD_DIR;
   } else {
    sDir = NOSDCARD_DIR;
   }


然后是创建文件夹

File destDir = new File(sDir);
   if (!destDir.exists()) {
    destDir.mkdirs();
   }


问题是:刚开始我的文件夹的目录是按照windows方式的例如"\sdcard\tempdir"结果运行后也不报错但是怎么也创建不了文件夹,后面想到应该是按linux格式的目录,改为"/sdcard/tempdir"后即可成功创建。
因为之前创建文件都是按照windows方式例如"\sdcard\test.txt"调用
new File("\\sdcard\\test.txt").createNewFile();创建而且可以成功,所以目录就没考虑。
经验证创建文件夹使用windows或者linux的目录结构都可以,而目录的话必须用linux的格式。

注:如果是1.6版本的话,需要注册sdcard权限才能正常建立文件夹及写入文件. 2.2以上不需要


 <!--往sdcard中写入数据的权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
 <!--在sdcard中创建/删除文件的权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>

 最近几天真的是各种意义上的忙,忙着考试,还要忙着课程设计,手上又有外包的项目,另一边学校的项目还要搞,自己的东西还在文档阶段,真的是让人想死啊!!

     近半个月来,C#这方面的编码比较多,android和java这里完全搁置了,于是抽空写个小例子。

     这个例子非常小,就是一个读取android根目录下的文件夹或文件,当做热一下身。

@Override 
public void onCreate(Bundle savedInstanceState) { 
   super.onCreate(savedInstanceState); 
   setContentView(R.layout.main);  
   EditText keywordText = (EditText)this.findViewById(R.id.keyword); 
   Button button = (Button)this.findViewById(R.id.button); 
   TextView result = (TextView)this.findViewById(R.id.result); 
   button.setOnClickListener(new Button.OnClickListener() { 
      public void onClick(View v) {
         String keyword = keywordText.getText().toString(); 
         if (keyword.equals("")) { 
             result.setText("请勿输入空白的关键词!!"); 
         }else { 
           result.setText(searchFile(keyword)); 
         } 
     } 
  }); 
}

private String searchFile(String keyword) { 
   String result = ""; 
   File[] files = new File("/").listFiles(); 
   for (File file : files) { 
     if (fike.getName().indexOf(keyword) >= 0) { 
       result += file.getPath() + "\n"; 
     } 
   } 
  if (result.equals("")){
    result = "找不到文件!!"; 
  }
 return result; 
}

      首先,我们需要通过File.listFiles()方法获取文件夹下所有文件或者文件夹的名字,这里的文件夹的路径是"/",也就是根目录。然后我们再通过getPath()逐个获取它们的相对路径。

      例子的运行结果如:

      

android Movies第一次开机创建内部存储文件夹 安卓开发创建文件夹_创建文件夹

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

     由于例子实在是太小了,整片文章的篇幅不长,所以特意在文章的后面列出所有的文件操作以供大家参考:

一.SDK的操作

1、判断SD卡是否插入

    Environment.getExternalStorageState().equals(

    android.os.Environment.MEDIA_MOUNTED);

    这个在我之前做的东西中就非常有用,因为涉及到SDK的读取,自然就需要先判断SDK是否插入。

2、获得sd卡根目录:  

     File skRoot = Environment.getExternalStorageDirectory();

二.私有目录下的文件操作:

1、获得私有根目录:

    File fileRoot = Context.getFilesDir()+"\";

2.文件夹或文件夹操作:

(1)获得文件夹和文件路径

a.获得文件或文件夹的绝对路径和相对路径。区别

    String path = File.getPath();//相对

    String path = File.getAbsoultePath();//绝对

b.获得文件或文件夹的父目录

   String parentPath = File.getParent();

c.获得文件或文件夹的名称:

   String Name = File.getName();

(2)建立文件或文件夹

   File.mkDir(); //建立文件夹

   File.createNewFile();//建立文件

(3)判断是文件或文件夹

   File.isDirectory()

   File.isDirectory()

(4)列出文件夹下的所有文件和文件夹名

   File[] files = File.listFiles();

(5)修改文件夹和文件名

   File.renameTo(dest);

(6)删除文件夹或文件

   File.delete();