详解Android数据存储之Android 6.0运行时权限下文件存储的思考

 更新时间:2016年12月07日 10:53:26   作者:总李写代码  
本篇文章主要介绍了Android数据存储之Android 6.0运行时权限下文件存储的思考,小编觉得挺不错的,现在分享给大家,也给大家做个参考。

前言:

在我们做App开发的过程中基本上都会用到文件存储,所以文件存储对于我们来说是相当熟悉了,不过自从Android 6.0发布之后,基于运行时权限机制访问外置sdcard是需要动态申请权限,所以以往直接sdcard根目录上直接新建了一个xxx/cache/目录来做文件存储就会不是那么容易控制了,所以有必要重新认识一下Android文件存储的相关知识了。

背景:

有关外置sdcard的读写权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

在Android 6.0 之前只要申明了上述两个权限就可以放心大胆的在sdcard上进行读写了,可惜Android 6.0之后就需要动态申请读写权限了,所以我们该如何适配Android 6.0来进行文件存储。首先我们在使用文件存储的时候尽量做到以下几点:

  • 不要随意占用用户的内置存储
  • 不要随意在SD卡上新建目录,应该放置自己应用包名对应的扩展存储目录下,卸载App时可以被自动清除。
  • 对占用的磁盘空间有上限,并按照一定的策略进行清除,比如DiskLru算法等。

Android文件存储目录:

1.)应用私有存储(内置存储)

访问方式 详细路径 是否需要申请权限

Context.getFileDir();获取内置存储下的文件目录,可以用来保存不能公开给其他应用的一些敏感数据如用户个人信息

 /data/data/应用包名/files/  否

Context.getCacheDir();获取内置存储下的缓存目录,可以用来保存一些缓存文件如图片,当内置存储的空间不足时将系统自动被清除

 /data/data/应用包名/cache/ 否 

注意:

 由于这里使用的是Android 手机内置存储,如果手机没有获得root权限的话文件浏览器是无法访问的,同样这种存储也会随之app被删除而被删除。

2.)应用扩展存储(SD卡)

访问方式 路径详情 是否需要申请权限

 Context.getExternalFilesDir();获取SD卡上的文件目录,

 SDCard/Android/data/应用包名/files/

 API < 19:是

API >= 19:否

 Context.getExternalCacheDir();获取SD卡上的缓存目录,可以用来保存一些缓存文件如图片

 SDCard/Android/data/应用包名/cache/

 API < 19:是

API >= 19:否

 注意:

   由于存储在sdcard上所以尽量不要存在敏感数据比如用户信息等,这里的文件也会随着app 被删除而被删除。

3.)公共存储(SD卡)

访问方式 路径详情 是否需要申请权限
Environment.getExternalStorageDirectory();获取sdcard根目录 SDCard/xxx文件夹名字/

注意:

有时我们也是需要存储一些公共文件,而且希望这些文件能够不随着App被删除而被删除,例如我们录制的视频或者下载的音乐等。由于这个目录可以被任何app访问,所以我们在使用的时候是需要申请权限的。

兼容Android 6.0 文件缓存实现

前提:这里主要处理一些非永久保存数据,需要永久保存的数据尽量还是要选择sdcard 公共存储方式的。

1.)获取缓存根目录

/**
   * 获取app的根目录
   *
   * @return 文件缓存根路径
   */
  public static String getDiskCacheRootDir() {
    File diskRootFile;
    if (existsSdcard()) {
      diskRootFile = LeeApplication.getApp().getExternalCacheDir();
    } else {
      diskRootFile = LeeApplication.getApp().getCacheDir();
    }
    String cachePath;
    if (diskRootFile != null) {
      cachePath = diskRootFile.getPath();
    } else {
      throw new IllegalArgumentException("disk is invalid");
    }
    return cachePath;
  }
 这里需要判断sdcard是否可用
 /**
   * 判断外置sdcard是否可以正常使用
   *
   * @return
   */
  public static Boolean existsSdcard() {
    return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) || !Environment.isExternalStorageRemovable();
  }

 2.)获取指定功能的目录

 /**
   * 获取相关功能业务目录
   *
   * @return 文件缓存路径
   */
  public static String getDiskCacheDir(String dirName) {
    String dir = String.format("%s/%s/", getDiskCacheRootDir(), dirName);
    File file = new File(dir);
    if (!file.exists()) {
      boolean isSuccess = file.mkdirs();
      if (isSuccess) {
        Log.d(TAG, "dir mkdirs success");
      }
    }
    return file.getPath();
  }

在日常开发过程中,我们需要不同的文件放在不同的目录下,比如:log日志文件需要放在log文件下,就可以通过上面的方法传入“log”获取该业务功能的文件夹。

3.)获取指定功能文件路径

/**
   * 获取log日志根目录
   * @return
   */
  public static String getLogDir(){
    return getDiskCacheDir(LOG);
  }

  /**
   * 根据logName 获取log文件全路径
   * @param logName
   * @return
   */
  public static String getLogFilePath(String logName){
    return getLogDir()+logName;
  }

 总结:

今天总结了Android的文件存储及在6.0上的适配问题,最近突然觉得自己有太多的知识需要学习了,也许由于现在的经济大环境导致互联网遇到了资本寒冬了,其实对于我来说2012年已经经历过一次了,对于技术人员来说应该冷静的看待这个问题,需要做的就是在寒冬里播种希望,那就是学习。以此共勉之~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 详解Android短信的发送和广播接收实现短信的监听

    详解Android短信的发送和广播接收实现短信的监听

    本篇文章主要介绍了Android短信的发送和广播接收实现短信的监听,可以实现短信收发,有兴趣的可以了解一下。
    2016-11-11
  • Android使用动画设置ProgressBar进度的方法

    Android使用动画设置ProgressBar进度的方法

    这篇文章主要为大家详细介绍了Android使用动画设置ProgressBar进度的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Android 仿微信小程序入口动画

    Android 仿微信小程序入口动画

    突然发现微信下拉小程序入口动画非常细腻,比较好奇,所以仿照他做了一个,并不是很完美,部分效果还没完成,但总体自我感觉还不错,效果见下文
    2021-06-06
  • Android SeekBar控制视频播放进度实现过程讲解

    Android SeekBar控制视频播放进度实现过程讲解

    这篇文章主要介绍了Android SeekBar控制视频播放进度实现过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-04-04
  • Android实现画板、写字板功能(附源码下载)

    Android实现画板、写字板功能(附源码下载)

    这篇文章主要介绍了Android实现画板、写字板功能的方法,文中给出了简单的介绍和示例代码,想要了解更多的朋友可以下载源码进行学习,感兴趣的朋友们下面来一起看看吧。
    2017-01-01
  • Android仿今日头条多个fragment懒加载的实现

    Android仿今日头条多个fragment懒加载的实现

    我们在做应用开发的时候,一个Activity里面可能会以viewpager(或其他容器)与多个Fragment来组合使用,下面这篇文章主要给大家介绍了关于利用Android仿今日头条多个fragment懒加载的相关资料,需要的朋友可以参考下。
    2017-12-12
  • Android实现手势密码功能

    Android实现手势密码功能

    这篇文章主要为大家详细介绍了Android实现手势密码功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • Android自动获取输入短信验证码库AutoVerifyCode详解

    Android自动获取输入短信验证码库AutoVerifyCode详解

    这篇文章主要为大家详细介绍了Android自动获取输入短信验证码库,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • Android生成条形码和二维码功能

    Android生成条形码和二维码功能

    随着移动互联网的普及以及智能终端设备的广泛应用,移动支付变得越来越便捷,通过扫描二维码代替传统的刷卡行为。这篇文章给大家介绍Android生成条形码和二维码功能,需要的朋友参考下吧
    2019-10-10
  • Android图像视图ImageView实现图像拉伸效果

    Android图像视图ImageView实现图像拉伸效果

    这篇文章主要为大家详细介绍了Android图像视图ImageView实现图像拉伸演示,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05

最新评论