Android应用存储路径选择方案的设计

1方案设计
  在各种应用设计的需求里,有可能涉及文件的存储路径的选择问题。本文介绍Android应用中涉及允许选择SD卡和手机存储,初步设想的方案:(1)在手机安装SD卡的情况下,优先选择存储在SD卡中,当用户卸载SD卡、拔出SD卡以及用户在设置中选择使用手机存储时,将选择存储在手机存储中;(2)在手机未安装SD卡的情况下,将存储在手机存储中,当用户安装入SD卡后,将主动选择存储在SD卡中。软件流程如下图所示。

  具体的路径如下:
SD卡:/storage/603E-5ED9/Movies/RecordVideo/
手机存储:/storage/emulated/0/Movies/RecordVideo/
2.实施方案
1)获取用户设置中选择的路径
  本应用创建了SettingFragment,并将路径选项用ListPreference实例化,在设置路径时,供用户在设置界面选择相应的路径。
  程序获取用户在设置中选择的路径,能通过获取此时设置界面中路径的选择项来判断此时的路径。由于我们提供给用户的只有2个选项:存储在手机内存中和存储在SD卡中。因此,在程序中使用布尔变量来判断用户是否选择使用SD卡存储视频。具体代码如下:

        SharedPreferences preferences = getSharedPreferences("recordscreensettings", MODE_PRIVATE);
        String typeView=preferences.getString(Config.ViewType, "0");
        String location=preferences.getString(Config.Location, "0");
        Log.v(tag, "location is "+location);
        if (location.equals("0")) {
            isUseSDcard=true;
            Log.v(tag, "isUseSDcard is "+isUseSDcard);
        }else  {
            isUseSDcard=false;
            Log.v(tag, "isUseSDcard is "+isUseSDcard);
        }

  可以通过判断isUseSDcard的值获取用户当前在设置中选择的路径。
2)获取手机中当前SD卡的挂载情况
  在获取用户在当前设置中选择的存储路径的同时,必须确定的是当前手机的SD卡是否挂载。有下面的情况是有可能存在的:手机中没有安装SD卡,手机中安装的SD卡没有识别和用户将SD卡卸载了。针对这种情况,我们在选择路径时应该判断当前SD卡的挂载情况。我们创建一个StorageUtils类管理应用的存储路径,写一个判断当前SD卡的挂载情况的方法。代码如下:

   public static boolean isSDCardExist(Context context, Object storageVolume) {
        boolean sdcardExist = isVolumeMounted(storageVolume);

        DebugLog.d(TAG, "isSDCardExist(): " + sdcardExist);

        return sdcardExist;
    }
     private static boolean isVolumeMounted(Object storageVolume) {
        boolean mountble = false;
        String storagePath = null;
        String state = null;
        try {
            if (null == storageVolume) {
                Log.d(TAG, "null == storageVolume failed in isVolumeRemoveble");
            }
            if (null == mStorageManager) {
                mStorageManager = mContext.getSystemService(Context.STORAGE_SERVICE);
            }
            storagePath = (String) storageVolume.getClass().getMethod("getPath").invoke(storageVolume);
            if (null == storagePath || 0 == storagePath.length()) {
                return false;
            }

            state = (String) mStorageManager.getClass().getMethod("getVolumeState", String.class)
                    .invoke(mStorageManager, storagePath);

            if (Environment.MEDIA_MOUNTED.equalsIgnoreCase(state)) {
                mountble = true;
            }
        } catch (Exception e) {
            Log.e(TAG, "Storage_Standard.isVolumeRemoveble()", e);
        }
        return mountble;
    }

  通过判断isSDCardExist方法返回的布尔值判断此时SD卡是否挂载。
3)对获取存储路径进行有效的选择
  对于路径的选择该应用只提供了2种选择方式。当选择SD卡成为视频存储的路径时,必须满足2个条件:

(1)用户在设置界面选择使用SD卡作为存储路径;

(2)使用SD卡存储视频时,SD卡挂载。通过上述分析,在获取视频存储路径时,应该对存储路径进行有效的选择,也就是路径选择正确且路径可用。

       if (isHaveSDcard&&isUseSDcard) {
            String pathSDStorage=storageUtils.getStorageDirectory(SdCardType.SDStorage);
            Log.v(tag, "pathSDStorage is "+pathSDStorage);
            pathstring=pathSDStorage;
        }else {
            String pathInternelStorage=storageUtils.getStorageDirectory(SdCardType.InternelStorage);
            Log.v(tag, "pathInternelStorage is "+pathInternelStorage);
            Log.v(tag, "the system of storage is"+Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES).toString());
            pathstring=pathInternelStorage;
        }

4)创建视频的文件名
  及时创建的文件应该给文件取一个合适的名称,本应用是即时软件,为了方便用户区别存储的文件,我们采用生成文件时的时间有关名称。名称格式如下:年-月-日_时_分_秒。

        SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd_hh_mm_ss");

        String date = "/myscreen_" + sDateFormat.format(new java.util.Date());
    

5)创建完整的视频存储路径
  通过上述的步骤,我们就获取到了文件的存储路径以及文件的名称,接下来需要完成创建完整的文件存储路径。为了方便用户在文件夹目录下查找,不论在SD卡还是手机中存储录文件,我们将存储的文件放置在../Movies/RecordVideo/(根据自己的应用取名)的文件夹下。具体代码如下。

        sampleDir=new File(pathstring+File.separator+"Movies"+ File.separator + "RecordVideo/");
        if (!sampleDir.exists()) {
            sampleDir.mkdirs();
            Log.v(tag, "创建文件夹"+sampleDir.mkdirs());
        }
        SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd_hh_mm_ss");

        String date = "/myscreen_" + sDateFormat.format(new java.util.Date());
        Log.v(tag, "date=" + date);

        mVecordFile = new File(sampleDir.toString() + date + ".mp4");
        Log.v(tag, mVecordFile.toString());

3.总结
  我们在获取存储路径时,应该充分考虑用户在设置中的路径选择以及存储路径是否存在的情况。

时间: 2024-10-15 21:33:16

Android应用存储路径选择方案的设计的相关文章

Android 数据存储方式分为哪几种?

10道题值得思考 第一道题 1.Android 数据存储方式分为哪几种? SharedPreferences存储数据 2. CotentProvider内容提供者 3. 文件存储 4. 数据库存储(Sqlite) 5.网络存储 2. NDK是什么? 1. 一系列工具类的集合 2. Arm指令集 3. NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk.这些工具对开发者的帮助是巨大的. NDK集成了交叉编译器,并提供了相应的mk文件隔离

Atitit.自定义存储引擎的接口设计 api 标准化 attilax 总结  mysql

Atitit.自定义存储引擎的接口设计 api 标准化 attilax 总结  mysql 1. 图16.1:MySQL体系结构1 2. 16.7. 创建表create()虚拟函数:2 3. 16.8. 打开表 open()2 4. ---------------------------------------------------------------------------------------------------------------------2 5. 16.9. 实施基本的

第6章 数据存储全方案,详解持久化技术

第6章 数据存储全方案,详解持久化技术 所有的App都可以说是与数据打交道的,离开数据它们什么都不是.那么平时我们怎么存储一些关键的数据呢? 1 持久化技术简介 数据持久化就是指将那些内存中的瞬时数据保存到存储设备中,保证即使在手机或电脑关机的情况下,这些数据仍然不会丢失.保存在内存中的数据是处于瞬时状态的,而保存在存储设备中的数据是处于持久状态的,持久化技术则是提供了一种机制可以让数据在瞬时状态和持久状态之间进行转换. Android系统中主要提供了三种方式用于简单地实现数据持久化功能,即文件

Android Art Hook 技术方案

Android Art Hook 技术方案 by 低端码农 at 2015.4.13 www.im-boy.net 0x1 开始 Anddroid上的ART从5.0之后变成默认的选择,可见ART的重要性,目前关于Dalvik Hook方面研究的文章很多,但我在网上却找不到关于ART Hook相关的文章,甚至连鼎鼎大名的XPosed和Cydia Substrate到目前为止也不支持ART的Hook.当然我相信,技术方案他们肯定是的,估计卡在机型适配上的了. 既然网上找不到相关的资料,于是我决定自己

android开发之-Android 开发之4.0界面设计原则-整理

设计原则: 一.让人着迷: 1.给人惊喜:使用漂亮的界面.精心的动画.适时的音乐. 2.真实的对象比按钮和菜单更有趣 这句话的意思是:使用描述描述性的图标作为快捷方式,界面美观 当然这个快捷方式是描述一个实体的,像一个人,不是扁平化的 3.个性化设计 提供个性化设计,提高亲切感和控制感.多设计几套个性化方案 4.记住人们的使用习惯,不要重复问 记住人们的使用习惯,不要重复问.多使用可以自动记住的控件,Autocomplete控件,不要每次询问操作 二.简单我的生活 1.使用简单词.短句子. 人们

Android 外部存储权限分析

不知道你有么有发现,来自菜鸟的成长史:http://blog.csdn.net/zjbpku/article/details/25161131, KitKat之后的版本不再支持用户对外置SDcard(Secondary Storage)的写入等操作.如果用户想要将文件等copy到手机中,则只能 存储到内部存储器中,而无法存储到外置sdcard中,而且无法创建新的文件夹,这样一来给用户和开发者都带来了一定的不便.之所 以在KitKat之后版本中无法操作外置Sdcard,是因为Google更改了此模

Android数据存储的五种方法汇总

本文介绍Android中的5种数据存储方式. 数据存储在开发中是使用最频繁的,在这里主要介绍Android平台中实现数据存储的5种方式,分别是: 1 使用SharedPreferences存储数据 2 文件存储数据 3 SQLite数据库存储数据 4 使用ContentProvider存储数据 5 网络存储数据 下面将为大家一一详细介绍. 第一种: 使用SharedPreferences存储数据 SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置

Android文件存储的问题:ClassLoader和实现Parcelable接口后 详解及用途

可能小伙伴们读了我上一篇博客关于Android文件存储的的,在文件操作的时候大家有没有疑问呀,有就对了,可能在保存自定义对象的时候,如何序列化呀?ClassLoader到底是啥鬼呀?序列化后怎么读取出来呀?好吧,针对于上面的问题,我一个一个的说明吧! 今天主要是讲ClassLoader的用途, ClassLoader主要对类的请求提供服务,当JVM需要某类时,它根据名称向ClassLoader要求这个类,然后由ClassLoader返回这个类的class对象. 1.1 几个相关概念ClassLo

Android——数据存储(四种方式之一)SharedPrefereces

Android--数据存储(四种方式) 1.SharedPrefereces   轻量级.XML  存储文件名,数据保存在data/data/basepackage/shared_prefs/myopt.xml中   实例-收藏-记住密码自动登录 //一种轻量级的数据存储方式//通过KEY 存入数据--putxxxx(key,value) 取出数据--getxxxx(key  default)   2.读写SD卡  SD的根目录  适用于数据流读写 3.SQLite  轻量级.dp文件多用于手机