Android Data Storage(数据存储)值External Storage

来源:互联网 发布:system32权限知乎 编辑:程序博客网 时间:2024/05/23 13:53

每个Android设备都支持共享“外部存储”   你可以用它来保存文件。   它可能是一个可移动的存储(如SD卡)也可能是一个固定的内部存储。   文件保存在外部存储中是公开的,当它使USB大容量转移到电脑上时,用户可以修改他们。

警告:如果用户在计算机上安装外部存储或删除媒体,则外部文件可能会消失,而文件保存到外部存储的文件没有安全性。所有应用程序都可以读取和写入文件放置在外部存储和用户可以删除它们。


在外部存储做一些工作之前,你应一致调用getExternalStorageState()方法来检测外部设备是否可用。 设备可能安装在电脑,丢失,只读或其他状态。 例如: 这里如何检测设备是否可用:

/** * 检测外部存储状态 */public void checkExternalStorage(){boolean mExternalSotrageAvailable = false;boolean mExternalStorageWriteable = false;// 获取外部存储状态String state = Environment.getExternalStorageState();if (Environment.MEDIA_MOUNTED.equals(state)) {// if the media is present and mounted at its mount point with read/write access. mExternalSotrageAvailable = mExternalStorageWriteable = true;} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)){// if the media is present and mounted at its mount point with read only access. mExternalSotrageAvailable = true;mExternalStorageWriteable = false;} else {mExternalSotrageAvailable = mExternalStorageWriteable = false;}}  

使用SdCard存储数据的方式与内部存储的方式基本一致,但是有三点需要注意的:

  • 第一点,需要首先判断是否存在可用的Sdcard,这个可以使用一个访问设备环境变量的类Environment进行判断,这个类提供了一系列的静态方法,用于获取当前设备的状态,在这里获取是否存在有效的Sdcard,使用的是Environment.getExternalStorageState()方法,返回的是一个字符串数据,Environment封装好了一些final对象进行匹配,除了Environment.MEDIA_MOUNTED外,其他均为有问题,所以只需要判断是否是Environment.MEDIA_MOUNTED状态即可。
  • 第二点,既然转向了Sdcard,那么存储的文件路径就需要相对变更,这里可以使用Envir.getExternalStorageDirectory()方法获取当Sdcard的根目录,可以通过它访问到相应的文件。
  • 第三点,需要赋予应用程序访问Sdcard的权限,Android的权限控制尤为重点,在Android程序中,如果需要做一些越界的操作,均需要对其进行授权才可以访问。在AndroidManifest.xml中添加代码:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

访问外部存储

如果你使用的API版本 8 或者更高, 使用getExternalFilesDir()打开文件 来代替外部存储目录,你应该保存你的文件在哪里。这个方法需要一个参数,指定类型就是你想要的子目录,例如 DIRECTORY_MUSIC 和DIRECTORY_RINGTONES(通过null 来接收你的应用程序的文件目录)。 如果需要该方法将在必须的时候创建目录。 通过指定目录类型, 你确保Android的扫描仪将妥善分类系统中你的文件(如:铃声是被确定的手机铃声而不是无音乐)  如果用户卸载了你的应用程序, 这些目录及所有内容将被删除。

如果你使用的API版本 7 或者更低,使用getExternalSotrageDirectory()打开文件作为外部存储根源, 你应该写入你的数据在这个目录下:
/Android/data/<package_name>/files/
这个<package_name>是你的Java样式里的包名,如"com.example.android.app"  如果用户的设备运行的API版本8或者更高,他们删除你的应用程序,这个目录及下面内容也将被删除。

保存应共享文件

如果你想保存文件没有特定你的应用程序,当你应用程序卸载时它将不会被删除。 保存他们在一个公共的外部存储目录之一中, 这个目录在外部存储根源,如Music/, Pictures/, Ringtones/ 或  其他。

在API版本 8 或更高, 使用getExternalStoragePublicDirectory()方法,你想要传递给它你想要的公共目录类型,如DIRECTORY_MUSIC, DIRECTORY_PICTYRES, 或其他。 该方法将在必要时创建适当的目录。

Music/ - 媒体扫描仪分类所有媒体在这里发现用户音乐。
Podcasts/ - 媒体扫描仪分类所有媒体在这里找到一个播客。
Ringtones/ - 媒体扫描将所有媒体发现这里作为铃声。
Alarms/ - 媒体扫描仪分类所有媒体在这里发现报警声。
Notifications/ - 媒体扫描仪分类所有媒体在这里发现的通知声音。
Pictures/ - 所有的照片(不包括与相机拍摄)。
Movies/ - 所有的电影(不包括那些被摄像机)。
Download/ - 其他下载。

保存Cache文件

如果你使用的API版本 8 或更高 , 使用 getExternalCacheDir() 打开文件用来代替外部存储目录,在哪里你可以保存临时文件。 如果用户卸载你的应用程序,文件将自动地删除。 然而,在你的应用程序存活的期间,你可以管理这个临时文件,不需要它时为了保护文件空间可以删除它。

如果你使用的API级别7或更低,使用getexternalstoragedirectory()打开一个文件,代表外部存储的根,然后把你的缓存数据在以下目录:

/Android/data/<package_name>/cache/


System.out.println("  getExternalFilesDir.getAbsolutePath()  -- >>>  " + getExternalFilesDir(Environment.DIRECTORY_MUSIC).getAbsolutePath());                System.out.println("  Environment.getExternalStorageDirectory().getAbsolutePath()  -- >>>  " + Environment.getExternalStorageDirectory().getAbsolutePath());         System.out.println("  public directory music -- >>>  " + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC));         System.out.println("  public directory pictures  -- >>>  " + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES));   输出结果:09-08 16:36:23.170: I/System.out(4407):   getExternalFilesDir.getAbsolutePath()  -- >>>  /storage/emulated/0/Android/data/com.mytest.activity/files/Music09-08 16:36:23.170: I/System.out(4407):   Environment.getExternalStorageDirectory().getAbsolutePath()  -- >>>  /storage/emulated/009-08 16:36:23.170: I/System.out(4407):   public directory music -- >>>  /storage/emulated/0/Music09-08 16:36:23.170: I/System.out(4407):   public directory pictures  -- >>>  /storage/emulated/0/Pictures


0 0
原创粉丝点击