【Android】14.2 外部文件存储和读取
分类:C#、Android、VS2015;
创建日期:2016-02-27
一、简介
1、基本概念
内部存储的私有可用存储空间一般都不会很大,对于容量比较大的文件,例如视频等,应该将其存储在外部存储设备(SD卡)上。
注意,不要将手机内存和手机内插入的存储卡(手机卡、SD卡)混淆在一起,内存是不能持久存储的,一关机所有信息就全部丢失了,而内部存储(移动经销商卖的手机卡,容量小,但是没有它打不了电话)、外部存储(SD卡,容量大,各种文件都能保存)都是可以持久存储的设备,因此才叫文件存储。
可以通过AOD模拟器指定要创建的SD卡的容量,具体见第2章的介绍。
外部存储(External storage)的特点是:
- 并不总是可用的,因为用户有时会通过USB存储模式挂载其他外部存储器,当取下挂载的这部分后,就无法对其进行访问了。
- 是大家都可以访问的,因此保存在这里的文件可能被其他程序访问。
- 当用户卸载app时,系统仅仅会删除external根目录下的相关文件。
- External storage是在不需要严格的访问权限并且希望这些文件能够被其他app所共享或者是允许用户通过电脑访问时的最佳存储区域。
(1)你的程序安装 到哪了
APP安装的位置:
app默认安装到internal storage中,我们可以通过在程序的manifest文件中声明android:installLocation属性来指定程序安装到external storage中:
<manifest … android:installLocation="preferExternal" >
当某个程序的安装文件很大且用户的external storage空间大于internal storage时,用户会倾向于将该程序安装到external storage。
(2)SD卡常用的文件夹
可以通过AOD模拟器指定要创建的SD卡的容量,具体见第2章的介绍。
下面是存储在SD卡上的常用文件夹:
- Alarms:保存用于警告的音频声音文件(audio files)。
- Dcim:保存相机拍摄的图片文件和视频文件(pictures and videos)。
- Downloads:保存用户下载的各种类型的文件。
- Movies:保存媒体浏览器可搜索到的电影文件。
- Music:保存媒体浏览器可搜索到的音乐文件。
- Notifications:保存用于通知的音频文件,例如短信通知等。
- Pictures:保存媒体浏览器可搜索到的图片文件。
- Podcasts:保存博客文件。
- Ringtones:保存手机铃声音频文件。
注意:在Android 6.0中,必须提供外部存储的读写权限才能对SD卡文件夹下的文件进行操作。
通过Environment类的静态属性可指定SD卡上的这些文件夹类型。
2、需要注意的问题
由于external storage可能不可用(比如SD卡被拔出或者损坏等情况),因此访问外部存储之前,应对其可用性进行检查,调用GetExternalStorgeState()方法可检测SD卡的状态,如果可用,直接通过普通的文件操作对其进行读写即可。
使用GetExternalFilesDir()方法创建的目录会在app被卸载时同时被系统删除。如果希望我们的文件在app被删除时仍然保留,请使用GetExternalStoragePublicDirectory()方法。
可通过调用GetFreeSpace()或者GetTotalSpace() 判断是否有足够的空间来保存文件。
3、如何将文件复制到模拟器的SD卡上
找到C:\Users\你的用户名\.android\avd\Galaxy_Api23.avd\sdcard.img,用虚拟光驱软件(比如UltraISO)打开这个文件,然后复制硬盘上的文件,将其粘贴到SD卡对应的目录下,保存即可。
二、示例
1、运行截图
运行后,在模拟器上查看SD卡上的Download文件夹,就会发现已经写入了a1.txt文件。
2、设计步骤
(1)检查对外部存储的读写权限
外部存储需要用户赋予对应的读写权限才可以通过程序读取和写入。
鼠标双击Properties文件夹,在弹出的窗口中,查看是否已经选中外部存储的写权限(WRITE_EXTERNAL_STORAGE),如果没有选中,选中它。
由于第3章的例子中已经赋予了写权限,因此你看到的应该是已经选中了。另外,如果用户给应用程序赋予了对外部存储的写权限,那么也意味着同时给这个应用程序赋予了读权限(READ_EXTERNAL_STORAGE),因此读权限不需要再选中。
(2)添加ch1402_Main.axml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button
android:id="@+id/MyButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="写入文件到SD卡的Download文件夹" />
</LinearLayout>
(3)添加ch1402MainActivity.cs文件
using Android.App;
using Android.OS;
using Android.Widget; namespace MyDemos.SrcDemos
{
[Activity(Label = "【例14-2】外部文件存取")]
public class ch1402MainActivity : Activity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.ch1402_Main); Button button = FindViewById<Button>(Resource.Id.MyButton);
button.Click += delegate
{
string rootDir = Android.OS.Environment.ExternalStorageDirectory.Path;
string downloadDir = Android.OS.Environment.DirectoryDownloads;
string filePath = $"{rootDir}/{downloadDir}/a1.txt";
if (Android.OS.Environment.ExternalStorageState == Android.OS.Environment.MediaMounted)
{
string text = "Hello,张三!";
System.IO.File.WriteAllText(filePath, text, System.Text.Encoding.UTF8);
Toast.MakeText(this, $"文件已写入到:\n{filePath}", ToastLength.Long).Show();
}
};
}
}
}
【Android】14.2 外部文件存储和读取的更多相关文章
- 【Android】14.1 内部文件存储和读取
分类:C#.Android.VS2015: 创建日期:2016-02-27 一.简介 内部存储(Internal storage)是指将应用程序建立的私有文件保存在内部存储器(移动经销商卖的那种容量较 ...
- android之外部文件存储和读取
这次借用上次读写内部存储的代码,只是对将更换文件的读写路径即可.这里需要对获取SDcard的读写权限. 一.AndroidManifest.xml 这里增加了对外部存储设备的读写权限 <?xml ...
- Android面试收集录 文件存储
1.请描述Android SDK支持哪些文件存储技术? 使用SharePreferences保存key-value类型的数据 流文件存储(openFileOutput+openFileInput或Fi ...
- Linux基础篇学习——Linux文件系统之文件存储与读取:inode,block,superblock
Linux文件类型 代表符号 含义 - 常规文件,即file d directory,目录文件 b block device,块设备文件,支持以"block"为单位进行随机访问 c ...
- Android常用布局、文件存储与权限、XML
常用的布局 LinearLayout Android 2.2开始fill_parent改名为match_parent ,从API Level为8开始我们可以直接用match_parent来代替fill ...
- Android学习--持久化(一) 文件存储
持久化之 文件存储 这里把Android持久化全都整理一下,这一篇文章先简单的说一下文件的存储,通过下面一个简单的Demo,理解一下这个文件存储,先说说下面Demo的思路: 1.创建EditTex ...
- 【Android】把外部文件拷贝的AVD安卓模拟器上的sdcard上,而且在AVD中浏览sdcard的文件
首先.实现这一切的大前提是.你的AVD安卓模拟器,在启动之前.有设置好sdcard的大小,例如以下图.同一时候,你的AVD安卓模拟器,要处于启动状态.否则无法运行例如以下的操作. 这里以<[An ...
- .Net下二进制形式的文件存储与读取
.Net下图片的常见存储与读取凡是有以下几种:存储图片:以二进制的形式存储图片时,要把数据库中的字段设置为Image数据类型(SQL Server),存储的数据是Byte[].1.参数是图片路径:返回 ...
- android之文件存储和读取
一.权限问题 手机中存储空间分为ROM和SDcard,ROM中放着操作系统以及我们安装的APP,而sdcard中一般放置着我们APP产生的数据.当然,Android也为每个APP在ROM中创建一个数据 ...
随机推荐
- Jacob的使用出错总结
转自:http://blog.163.com/wm_at163/blog/static/13217349020114166447941/ Jacob的使用方法: 1.在工程中导入 jacob.jar ...
- OpenCV特征描述
特征描述 目标 在本教程中,我们将涉及: 使用 DescriptorExtractor 接口来寻找关键点对应的特征向量. 特别地: 使用 SurfDescriptorExtractor 以及它的函数 ...
- Python任务调度模块 – APScheduler。动态修改调度时间间隔
APScheduler可以把调度任务放到内存里,也可以把任务放到数据库里,那么如何交互式修改定时任务的执行时间间隔或者下次执行时间呢? 方案一:把定时任务放到数据库里,修改数据库里任务的调度时间 方案 ...
- 解决 org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type的问题
具体错误如下: Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying be ...
- Android -- sqlite数据库随apk发布
背景 把在工程中测 ...
- windows live writer首行缩进问题的解决
使用live writer写博客的确方便,但有个简单的问题,我始终无法解决,就是发布的博客老是无法首行缩进,试过好多方法,都有问题: 直接加全角空格.上传时就给过滤掉了. 修改defaultcss,结 ...
- XML,dom4j和Java
看了“罗辑思维”的节目,终于克服了自己的拖延症,开始动笔写这篇文章了. 写这篇文章的目的是把XML的解析,萃取和验证都尽量覆盖一下,存储以便日后备考,使用的包是dom4j,涉及语言是Java. dom ...
- Inside GDALAllRegister之三: 注册指定驱动
现在来仔细分析如何注册一个驱动的代码,看下面代码: #ifdef FRMT_vrt GDALRegister_VRT(); #endif 编译时指定或者取消FRMT_vrt,可以控制这条语句是否编译到 ...
- InnerHTML属性的XSS利用
来自:http://www.myhack58.com/Article/html/3/7/2011/32395.htm innerHTML 是个奇怪的HTML属性,不是W3C标准支持的,但几乎所有的厂商 ...
- javaSE知识点汇总
Java基础知识精华部分 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java语言 ...