共享偏好文件命名时,你应该使用一个名称标识的应用程序,如“com.example.myapp.PREFERENCE_FILE_KEY”
警告:如果你创建一个共享MODE_WORLD_READABLE或MODE_WORLD_WRITEABLE首选项文件,然后任何其他应用程序知道文件标识符可以访问您的数据。
警告:如果你创建一个共享MODE_WORLD_READABLE或MODE_WORLD_WRITEABLE首选项文件,然后任何其他应用程序知道文件标识符可以访问您的数据。
从共享首选项文件中检索值,调用方法如getInt()和getString(),提供你想要的价值的关键,选择返回默认值,如果不存在的关键。例如:
保存文件
Android使用的文件系统类似于其他平台上的基于磁盘的文件系统。本课程介绍如何使用Android文件系统读取和写入文件的文件api。
一个文件对象是适合阅读或写作大量数据提供顺序没有跳过。例如,它对图像文件或任何通过网络交换。
这节课展示了如何执行基本与文件相关的任务应用程序。这个教训假定您熟悉基本的Linux文件系统和标准文件输入/输出在io api。
选择内部或外部存储
所有的Android设备有两个文件存储区域:“内部”和“外部”存储。这些名字来自Android的早期,当大多数设备提供了内置的非易失性存储器(内存),加上一个可移动的存储介质,如微型SD卡(外部存储器)。一些设备将永久存储空间划分为“内部”和“外部”分区,所以即使没有一个可移动的存储介质,总有两种存储空间和API行为是相同的外部存储是否r emovable与否。以下列表总结关于每个存储空间的事实。
内部存储:
它总是可用的。
文件保存在默认情况下只可以访问应用程序。
当用户卸载你的应用时,系统会删除所有你的应用从内部存储的文件。
内部存储最好当你想确保无论是用户还是其他应用程序可以访问你的文件
外部存储:
这并不总是可用,因为用户可以安装外部存储USB存储和在某些情况下将它从设备。
这是公开的,所以文件保存在这里可能会读你的控制之外。
当用户卸载应用程序,系统删除应用程序的文件从这里只有如果你拯救他们的目录从getExternalFilesDir()。
外部存储器的最好的地方是不需要的文件访问限制,你想与其他应用程序共享的文件或允许用户访问计算机。
提示:尽管应用程序安装到内部存储在默认情况下,您可以指定android:installLocation属性在你显化你的应用程序可以安装在外部存储器。用户欣赏这个选项当APK文件大小是非常大的,他们有一个外部比内部存储器的存储空间。有关更多信息,请参见应用安装位置。
获得外部存储权限
写外部存储,你必须请求WRITE_EXTERNAL_STORAGE许可清单文件:
注意:目前,所有应用程序可以读取外部存储没有特别许可。然而,这将改变在将来发布的版本中。如果您的应用程序需要读取外部存储器(但不写),那么您将需要申报READ_EXTERNAL_STORAGE许可。确保应用程序继续正常工作,你现在应该宣布这个许可,在更改生效。
然而,如果您的应用程序使用WRITE_EXTERNAL_STORAGE许可,那么它隐式权限读取外部存储器。
你不需要任何权限保存在内部存储的文件。应用程序总是读和写文件的权限在其内部存储目录。
在内部存储器保存一个文件
当一个文件保存到内部存储,您可以获得适当的目录作为一个文件通过调用两种方法之一:
getFilesDir()
返回一个文件代表内部目录为您的应用程序。
getCacheDir()
返回一个文件代表内部目录app的临时缓存文件。一定要删除每个文件一旦不再需要和实现一个合理的大小限制的内存使用在任何给定的时间,比如1 mb。如果系统开始运行低存储、删除缓存文件没有警告。
在一个目录中创建一个新文件,您可以使用文件()构造函数,通过上述方法之一提供的文件,指定您的内部存储目录。例如:
File file = new File(context.getFilesDir(), filename);
或者,你可以叫openFileOutput()获得FileOutputStream写入一个文件在你的内部目录中。例如,下面是如何编写一些文本文件:
String filename = "myfile"; String string = "Hello world!"; FileOutputStream outputStream; try { outputStream = openFileOutput(filename, Context.MODE_PRIVATE); outputStream.write(string.getBytes()); outputStream.close(); } catch (Exception e) { e.printStackTrace(); }
或者,如果您需要缓存一些文件,你应该使用createTempFile()。例如,下面的方法提取文件的名字从一个URL并创建一个文件,这个名字在你的应用程序的内部缓存目录:
public File getTempFile(Context context, String url) { File file; try { String fileName = Uri.parse(url).getLastPathSegment(); file = File.createTempFile(fileName, null, context.getCacheDir()); catch (IOException e) { // Error while creating file } return file; }注意:您的应用程序的内部存储目录是由应用程序指定包名的安卓系统文件系统的一个特殊的位置。从技术上讲,另一个应用程序可以读取你的内部文件如果你设置的文件模式可读。然而,其他应用程序也需要知道应用程序包名和文件名。其他应用程序不能浏览你的内部目录和没有读或写访问,除非您显式地设置文件读取或写入。只要你使用MODE_PRIVATE内部存储你的文件,他们从来没有访问其他应用程序。
保存一个文件在外部存储器
因为外部存储器可能unavailable-such当用户安装电脑的存储或删除提供外部的SD卡存储空间之前应该确认体积可以访问它。你可以查询通过调用外部存储状态getExternalStorageState()。如果返回的状态等于MEDIA_MOUNTED,然后你可以读和写你的文件。例如,下面的方法来确定存储可用性是有用的:
/* Checks if external storage is available for read and write */ public boolean isExternalStorageWritable() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { return true; } return false; } /* Checks if external storage is available to at least read */ public boolean isExternalStorageReadable() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { return true; } return false; }
虽然外部存储修改的由用户和其他应用程序,这里有两个类别的文件你可能保存:
公共文件
文件应该免费提供给其他应用程序和用户。当用户卸载应用程序时,这些文件应该保持用户可用。
例如,照片被应用程序或其他下载文件。
私人的文件
文件本来就是属于你的应用时,应删除用户卸载应用程序。尽管这些文件在技术上可由用户和其他应用程序,因为他们是在外部存储,它们实际的文件不提供价值给用户以外的应用程序。当用户卸载你的应用时,系统将删除所有文件在您的应用程序的外部私人目录。
例如,额外的应用程序下载的资源或临时的媒体文件。
如果你想保存公共文件在外部存储,使用getExternalStoragePublicDirectory()方法来获取外部存储上的文件代表相应的目录。方法接受一个参数指定类型的文件你想保存,这样他们可以在逻辑上组织与其他公共文件,如DIRECTORY_MUSIC或DIRECTORY_PICTURES。例如:
public File getAlbumStorageDir(String albumName) { // Get the directory for the user's public pictures directory. File file = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES), albumName); if (!file.mkdirs()) { Log.e(LOG_TAG, "Directory not created"); } return file; }
如果你想保存文件到您的应用程序而言是私有的,您可以获得适当的目录通过调用getExternalFilesDir()和传递给它一个名称显示目录你喜欢的类型。这种方式创建的每个目录添加到父目录,封装了所有应用程序的外部存储文件,系统删除当用户卸载应用程序。
例如,这里有一个方法可以用来创建一个目录的个人相册:
public File getAlbumStorageDir(Context context, String albumName) { // Get the directory for the app's private pictures directory. File file = new File(context.getExternalFilesDir( Environment.DIRECTORY_PICTURES), albumName); if (!file.mkdirs()) { Log.e(LOG_TAG, "Directory not created"); } return file; }
如果没有一个预先定义的子目录名字适合你的文件,你可以叫getExternalFilesDir()和传递null。这将返回您的应用程序的根目录的私人在外部存储目录。
记住getExternalFilesDir()创建一个目录下的目录,当用户删除卸载应用程序。如果你保存的文件应该保持可用用户卸载之后你的应用(比如应用程序是一个摄像头,用户会想保持照片你应该使用getExternalStoragePublicDirectory()。
无论您使用getExternalStoragePublicDirectory()文件共享或getExternalFilesDir()的文件到你的应用程序而言是私有的,重要的是你使用API提供的目录名像DIRECTORY_PICTURES常量。这些目录名称确保文件系统适当的治疗。例如,文件保存在DIRECTORY_RINGTONES系统分类的媒体扫描仪代替音乐铃声。
查询空闲空间
如果你知道提前多少数据你保存,你可以找到足够的空间是否可用不会造成一个IOException通过调用getFreeSpace()或getTotalSpace()。这些方法提供当前可用的空间和总空间存储卷,分别。这些信息也是有用的,以避免填充储存容量超过一定阈值。
然而,系统不保证你可以写尽可能多的字节由getFreeSpace表示()。如果返回几MB数量超过你想保存的数据的大小,或者文件系统还不到90%,那么它可能是安全的。否则,你可能不能写入存储。
注意:您不需要检查的可用空间在你保存你的文件。你可以试着写文件,然后抓住一个IOException如果发生。你可能需要这样做,如果你不知道你需要多少空间。例如,如果你改变文件的编码保存之前将PNG图像转换成JPEG,事先你不知道文件的大小。
删除一个文件
myFile.delete();如果文件是保存在内部存储,你也可以问下定位和删除一个文件通过调用
myContext.deleteFile(fileName);
注意:当用户卸载应用程序,Android系统删除以下:
你保存在内部存储的所有文件
所有文件保存在外部存储使用getExternalFilesDir()。
然而,您应该手动删除所有缓存文件创建getCacheDir定期(),还定期删除不再需要的其他文件。