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年已经经历过一次了,对于技术人员来说应该冷静的看待这个问题,需要做的就是在寒冬里播种希望,那就是学习。以此共勉之~

时间: 2024-12-25 23:17:56

Android数据存储之Android 6.0运行时权限下文件存储的思考的相关文章

Android 6.0+ 运行时权限

1.权限被分为了普通和危险两种 2.打电话的Demo import android.Manifest; import android.app.Activity; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Bundle; import android.provider.Settings; import andro

Android 6.0 运行时权限管理最佳实践

Android 6.0 运行时权限管理最佳实践 版权声明:转载必须注明本文转自严振杰的博客: http://blog.yanzhenjie.com 这是一篇迟来的博客,Android M已经发布一年多了(6.0的变化),在Android M中权限系统被重新设计,发生了颠覆性的变化,很多人把握不好这个变化,一是对这个权限策略和套路还没有摸透,二是没有一个很好的实践来支撑,在我的技术开发群里很多人问我关于权限的问题,往往我都没有直接回答,因为这个问题不是一两句说的清楚的,这几点是今天我写这篇博客的原

1.Android6.0运行时权限简介_2.Android6.0权限适配之WRITE_EXTERNAL_STORAGE(SD卡写入)3_.Android 6.0 运行时权限理解

Android6.0运行时权限简介:http://unclechen.github.io/2016/03/05/Android6.0%E8%BF%90%E8%A1%8C%E6%97%B6%E6%9D%83%E9%99%90%E7%AE%80%E4%BB%8B/ Android6.0权限适配之WRITE_EXTERNAL_STORAGE(SD卡写入):https://blog.csdn.net/xiechengfa/article/details/52699233 Android 6.0 运行时权

Android6.0运行时权限(基于RxPermission开源库)

版权声明:本文为博主原创文章,未经博主允许不得转载. 前言 在6.0以前的系统,都是权限一刀切的处理方式,只要用户安装,Manifest申请的权限都会被赋予,并且安装后权限也撤销不了. Android 6.0 采用新的权限模型,只有在需要权限的时候,才告知用户是否授权:是在runtime时候授权,而不是在原来安装的时候 ,同时默认情况下每次在运行时打开页面时候,需要先检查是否有所需要的权限申请. 判断是否是需要运行时权限的标记就是targetSDKVersion. 当targetSDKVersi

Android 6.0 运行时权限处理完全解析

一.概述 随着Android 6.0发布以及普及,我们开发者所要应对的主要就是新版本SDK带来的一些变化,首先关注的就是权限机制的变化.对于6.0的几个主要的变化,查看查看官网的这篇文章http://developer.android.com/intl/zh-cn/about/versions/marshmallow/android-6.0-changes.html,其中当然包含Runtime Permissions. ok,本篇文章目的之一就是对运行时权限处理的一个介绍,以及对目前权限相关的库

Android 6.0 运行时权限管理

android 6.0 对权限进行了严格的管理 新的权限策略讲权限分为两类,第一类是不涉及用户隐私的,只需要在Manifest中声明即可,比如网络.蓝牙.NFC等:第二类是涉及到用户隐私信息的,需要用户授权后才可使用,比如SD卡读写.联系人.短信读写等. Normal Permissions 此类权限都是正常保护的权限,只需要在AndroidManifest.xml中简单声明这些权限即可,安装即授权,不需要每次使用时都检查权限,而且用户不能取消以上授权,除非用户卸载App. ACCESS_LOC

Android 6.0 运行时权限处理

运行时权限介绍 Android 6.0在我们原有的AndroidManifest.xml声明权限的基础上,又新增了运行时权限动态检测,以下权限都需要在运行时判断: 身体传感器 日历 摄像头 通讯录 地理位置 麦克风 电话 短信 存储空间 运行时权限处理 Android6.0系统默认为targetSdkVersion小于23的应用默认授予了所申请的所有权限,所以如果你以前的APP设置的targetSdkVersion低于23,在运行时也不会崩溃,但这也只是一个临时的救急策略,用户还是可以在设置中取

Android 6.0+ 运行时权限探索

原创文章,转载请注明 ( 来自:http://blog.csdn.net/leejizhou/article/details/51511630 李济洲的博客 ) 引言:去年Android 6.0发布后,其新引入的(Requesting Permissions at Run Time)运行时权限就备受开发者关注,随着今年国内手机厂商对6.0系统的普及,觉得大家有必要了解下这个新特性,因为在TargetSDK23+进行开发不注意这些会造成APP运行在6.0+手机上崩溃,这篇博文将对这个新特性进行探索

Android6.0运行时权限

从 Android 6.0(API 级别 23)开始,用户在使用软件时向其授予权限,而不是在安装时授权.这个方法可以简化安装过程,用户在安装或者更新软件时不需要授予权限.它还能让用户对应用的功能进行控制.例如一个摄影应用,他使用摄像头权限是正常的,但是用户无法理解这个应用要读取联系人信息. 系统权限分为两类:正常权限跟危险权限 正常权限不会直接给用户隐私权带来风险.在AndroidManifest.xml中注册就行. 危险权限会授予应用访问用户机密数据的权限.在AndroidManifest.x