zoukankan      html  css  js  c++  java
  • 【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你的用户名.androidavdGalaxy_Api23.avdsdcard.img,用虚拟光驱软件(比如UltraISO)打开这个文件,然后复制硬盘上的文件,将其粘贴到SD卡对应的目录下,保存即可。

    二、示例

    1、运行截图

    运行后,在模拟器上查看SD卡上的Download文件夹,就会发现已经写入了a1.txt文件。

    image

    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, $"文件已写入到:
    {filePath}", ToastLength.Long).Show();
                    }
                };
            }
        }
    }
  • 相关阅读:
    Centos下Zookeeper的安装部署
    Zookeeper入门
    Redis高可用-主从,哨兵,集群
    Redis入门
    centos7 安装redis6.0.3
    二叉树的遍历及常用算法
    分享一个seata demo,讲两个个问题
    互联网公司,我们需要什么样的中层技术管理以及996和程序员有多大关系?
    Spring Boot微服务如何集成seata解决分布式事务问题?
    软件服务架构的一些感悟
  • 原文地址:https://www.cnblogs.com/rainmj/p/5223693.html
Copyright © 2011-2022 走看看