分类: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 外部文件存储和读取的更多相关文章

  1. 【Android】14.1 内部文件存储和读取

    分类:C#.Android.VS2015: 创建日期:2016-02-27 一.简介 内部存储(Internal storage)是指将应用程序建立的私有文件保存在内部存储器(移动经销商卖的那种容量较 ...

  2. android之外部文件存储和读取

    这次借用上次读写内部存储的代码,只是对将更换文件的读写路径即可.这里需要对获取SDcard的读写权限. 一.AndroidManifest.xml 这里增加了对外部存储设备的读写权限 <?xml ...

  3. Android面试收集录 文件存储

    1.请描述Android SDK支持哪些文件存储技术? 使用SharePreferences保存key-value类型的数据 流文件存储(openFileOutput+openFileInput或Fi ...

  4. Linux基础篇学习——Linux文件系统之文件存储与读取:inode,block,superblock

    Linux文件类型 代表符号 含义 - 常规文件,即file d directory,目录文件 b block device,块设备文件,支持以"block"为单位进行随机访问 c ...

  5. Android常用布局、文件存储与权限、XML

    常用的布局 LinearLayout Android 2.2开始fill_parent改名为match_parent ,从API Level为8开始我们可以直接用match_parent来代替fill ...

  6. Android学习--持久化(一) 文件存储

    持久化之   文件存储 这里把Android持久化全都整理一下,这一篇文章先简单的说一下文件的存储,通过下面一个简单的Demo,理解一下这个文件存储,先说说下面Demo的思路: 1.创建EditTex ...

  7. 【Android】把外部文件拷贝的AVD安卓模拟器上的sdcard上,而且在AVD中浏览sdcard的文件

    首先.实现这一切的大前提是.你的AVD安卓模拟器,在启动之前.有设置好sdcard的大小,例如以下图.同一时候,你的AVD安卓模拟器,要处于启动状态.否则无法运行例如以下的操作. 这里以<[An ...

  8. .Net下二进制形式的文件存储与读取

    .Net下图片的常见存储与读取凡是有以下几种:存储图片:以二进制的形式存储图片时,要把数据库中的字段设置为Image数据类型(SQL Server),存储的数据是Byte[].1.参数是图片路径:返回 ...

  9. android之文件存储和读取

    一.权限问题 手机中存储空间分为ROM和SDcard,ROM中放着操作系统以及我们安装的APP,而sdcard中一般放置着我们APP产生的数据.当然,Android也为每个APP在ROM中创建一个数据 ...

随机推荐

  1. [Android Pro] Android应用性能测试之CPU和内存占用(转载)

    首先稍做分析一下测试环境:我们知道CPU和内存占用是一个实时变化的状态,而市面上还没有具体的哪款android应用能做到实时监控CPU和内存占用并使用log日志保存.考虑到android的底层框架是基 ...

  2. ContentProvider的那些小事(纯结论)

    一.ContentProvider背景 Android系统是基于Linux系统内核来进行开发的,在Linux中,文件具有一系列的属性,其中最重要的莫过于文件权限了.关于文件权限,其实就是文件的读写,执 ...

  3. JOIN与EXISTS(子查询)的效率研究

    使用MySQL提供的Sample数据库Sakila 现将profiling打开,用来一会查看sql执行时间 set profiling=1; exists 子查询与 join联接效率的对比,功能:查看 ...

  4. Informatica 常用组件Source Qualifier之四 SQL Query

    源限定符转换提供 SQL 查询选项以覆盖默认的查询.您可以输入您的源数据库支持的 SQL 语句.输入查询之前,请连接您要在映射中使用的所有输入和输出端口. 编辑 SQL 查询时,您可以生成并编辑默认查 ...

  5. 8个使用JavaScript展示图片解决方案

    1. JonDesign’s SmoothGallery 2.0 SmoothGallery demo 2. (E)2 Photo Gallery (E)2 Photo Gallery demo 3. ...

  6. JSP学习笔记(三):Session和Cookie

    一.JSP Session HTTP是无状态协议,这意味着每次客户端检索网页时,都要单独打开一个服务器连接,因此服务器不会记录下先前客户端请求的任何信息.有三种方法来维持客户端与服务器的会话: 1.C ...

  7. Linux的防火墙–Iptables

    导读 Iptable已经集成在Linux 2.4及以上版本的内核中,同Windows下的众多“傻瓜”防火墙不同的是,Iptables需要用户自己定制相关规则.下面我就给大家简单介绍一下关于防火墙的基本 ...

  8. M.2接口NVMe协议的固态硬盘读写速度是SATA接口的两倍

    原文:https://www.sohu.com/a/203688929_615464 中午走路的时候,同事说的,M 2 nvme接口的更快. 树莓派开发板可以跑linux . ------------ ...

  9. RS请求错误之RSV-BBP-0028

    环境:Version  Cognos10.2 单机 非集群 运行报表的时候经常遇到: 错误信息为: The secondary request failed. The requested sessio ...

  10. [Functional Programming] Pointy Functor Factory

    A pointed functor is a functor with an of method class IO { // The value we take for IO is always a ...