AppDir【创建缓存目录】
版权声明:本文为HaiyuKing原创文章,转载请注明出处!
前言
创建缓存目录
    public static String APP_CACHE = "";//   /storage/emulated/0/Android/data/{package}/cache/
    public static String IMAGE = "";//       /storage/emulated/0/Android/data/{package}/cache/image
    public static String CAMERA = "";//      /storage/emulated/0/Android/data/{package}/cache/camera
    public static String GIF = "";//         /storage/emulated/0/Android/data/{package}/cache/gif
    public static String FUND = "";//        /storage/emulated/0/Android/data/{package}/cache/fund
    public static String CRASH = "";//       /storage/emulated/0/Android/data/{package}/files/crash
    public static String PLAYER = "";//      /storage/emulated/0/Android/data/{package}/files/player
    public static String P2P = "";//         /storage/emulated/0/Android/data/{package}/files/p2p
    public static String DOWNLOAD = "";//    /storage/emulated/0/Android/data/{package}/files/download或者自定义的目录
  
注意:因为创建目录都是在/storage/emulated/0/Android/data/{package}目录中,所以本来不需要权限;但是下载目录有可能需要使用SD卡中的自定义目录,所以还是需要权限的。【20191124,不需要权限】
效果图
暂不需要
代码分析
AppDir : 自定义需要创建的缓存目录
FileUtils : 创建目录、删除目录下所有文件、获取目录下第一个文件path
使用步骤
一、项目组织结构图

注意事项:
1、 导入类文件后需要change包名以及重新import R文件路径
2、 Values目录下的文件(strings.xml、dimens.xml、colors.xml等),如果项目中存在,则复制里面的内容,不要整个覆盖
二、导入步骤
将AppDir、FileUtils复制到项目中
【20191124更新】
package com.why.project.appdirdemo.utils; import android.content.Context;
import android.os.Build;
import android.os.Environment; import java.io.File; /**
* Created by HaiyuKing
* Used 创建缓存目录
* 安卓手机的存储分为 2 部分,内部存储 ( Internal ) 和外部存储( External ):
* 内部存储是指系统的存储空间,没有root是访问不到的呦亲,比如sharedPreferenced或者database都是保存在这里面的。
* 外部存储,又分为 2 部分:【操作外部存储你首先需要以下权限:WRITE_EXTERNAL_STORAGE,不过Android Q之后不再需要申请该权限】
* 机器自带的存储【ExternalStorage】,也就是手机厂商常说的16G,32G,64G之类的存储空间。
* SD卡,其实正确叫法应该是TF卡,就是可插拔的那个小东西。
* 参考资料:https://www.jianshu.com/p/116025bf51f7
*/ public class AppDir { public static final String TAG = AppDir.class.getName(); private static Context mContext; enum Type {
CACHE,FILE;
} public static String APP_CACHE = "";// /storage/emulated/0/Android/data/{package}/cache/
public static String IMAGE = "";// /storage/emulated/0/Android/data/{package}/cache/image
public static String CAMERA = "";// /storage/emulated/0/Android/data/{package}/cache/camera
public static String GIF = "";// /storage/emulated/0/Android/data/{package}/cache/gif
public static String FUND = "";// /storage/emulated/0/Android/data/{package}/cache/fund
public static String CRASH = "";// /storage/emulated/0/Android/data/{package}/files/crash
public static String PLAYER = "";// /storage/emulated/0/Android/data/{package}/files/player
public static String P2P = "";// /storage/emulated/0/Android/data/{package}/files/p2p
public static String DOWNLOAD = "";// /storage/emulated/0/Android/data/{package}/files/download或者自定义的目录 public static AppDir getInstance(Context mContext){
AppDir appDir = new AppDir();
appDir.mContext = mContext;
initDatas();
return appDir;
} private static void initDatas(){
APP_CACHE = createPath("APP_CACHE", 0, "", Type.CACHE);
IMAGE =createPath("IMAGE", 1, "image", Type.CACHE);
CAMERA = createPath("CAMERA", 2, "camera", Type.CACHE);
GIF = createPath("GIF", 3, "gif", Type.CACHE);
FUND = createPath("FUND", 4, "fund", Type.CACHE);
CRASH = createPath("CRASH", 5, "crash", Type.FILE);
PLAYER = createPath("PLAYER", 6, "player", Type.FILE);
P2P = createPath("P2P", 8, "p2p", Type.FILE);
//DOWNLOAD = createDownloadPath();//20191124,该方法不再使用
DOWNLOAD = createPath("download", 9, "download", Type.FILE);
} private static String createPath(String name, int index, String subpath, Type p) {
String cachePath = mContext.getExternalCacheDir() + File.separator;//一般存放临时缓存数据
String filePath = mContext.getExternalFilesDir(null) + File.separator;//一般放一些长时间保存的数据
String path = p == Type.CACHE ? cachePath + subpath : filePath + subpath; //Log.e(TAG,"{AppDir}name="+name+";path="+path);
FileUtils.makeDirs(path);//创建目录
return path;
} /**
* 20191124
* 这个方法不建议使用,留在这里作为备份*/
private static String createDownloadPath() {
String path = "";
// 判断sd卡是否存在
boolean sdCardExit = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
//Log.e(TAG,"{AppDir}sdCardExit="+sdCardExit);
if (sdCardExit) {
if(Build.VERSION.SDK_INT >= 19) {//如果版本大于19,则直接在缓存目录中创建download目录
File[] files = mContext.getExternalFilesDirs("download");
if(files != null && files.length >= 1 && files[0] != null) {
path = files[0].getAbsolutePath();// /storage/emulated/0/Android/data/{package}/files/download
}
}else {
path = Environment.getExternalStorageDirectory() + File.separator + "why/download";//使用自定义的download目录
}
}else{
path = Environment.getDataDirectory() + File.separator + "why/download";//使用自定义的download目录
}
//Log.e(TAG,"{AppDir}DOWNLOAD"+";path="+path);
FileUtils.makeDirs(path);//创建目录
return path;
} }
AppDir
package com.why.project.appdirdemo.utils; import android.text.TextUtils; import java.io.File; /**
* Created by HaiyuKing
* Used 配合APPDir的文件工具类
*/ public class FileUtils { //创建目录
public static boolean makeDirs(String filePath) {
if (TextUtils.isEmpty(filePath)) {
return false;
} File folder = new File(filePath);
return (folder.exists() && folder.isDirectory()) ? true : folder.mkdirs();
} //获取目录名
public static String getFolderName(String filePath) { if (TextUtils.isEmpty(filePath)) {
return filePath;
} int filePosi = filePath.lastIndexOf(File.separator);
return (filePosi == -1) ? "" : filePath.substring(0, filePosi);
} /**删除所有文件*/
public static void deleteAllFile(String filePath)
{
if(!TextUtils.isEmpty(filePath)) {
deleteAllFiles(new File(filePath));
}
} /**删除所有文件*/
public static void deleteAllFiles(File root)
{
File[] arrayOfFile = root.listFiles();
if (arrayOfFile != null)
{
for(int j = 0;j < arrayOfFile.length;j++){
File file = arrayOfFile[j];
if (file.isDirectory())
{
deleteAllFiles(file);
file.delete();
}else if(file.exists()){
deleteAllFiles(file);
file.delete();
}
}
}
} /**获取第一个文件的完整路径*/
public static String firstFile(String parentPath){
File[] arrayOfFile = new File(parentPath).listFiles();
String firstFilePath = "";
if (arrayOfFile != null)
{
File file0 = arrayOfFile[0];
firstFilePath = file0.getPath();
}
return firstFilePath;
}
}
FileUtils
在AndroidManifest.xml文件中声明权限【20191124,不需要权限】
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.why.project.appdirdemo"> <!-- =================AppDir用到的权限========================== -->
<!-- 允许程序读取外部存储文件 -->
<!--<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>-->
<!-- 允许程序写入外部存储,如SD卡上写文件 -->
<!--<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>--> <application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application> </manifest>
添加运行时权限的处理(本demo中采用的是修改targetSDKVersion=22)
三、使用方法
package com.why.project.appdirdemo; import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log; import com.why.project.appdirdemo.utils.AppDir;
import com.why.project.appdirdemo.utils.FileUtils; import java.io.File; public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); String pngFilePath = AppDir.getInstance(this).IMAGE + File.separator + System.currentTimeMillis() + ".png";
Log.e(TAG,"pngFilePath="+pngFilePath);// /storage/emulated/0/Android/data/com.why.project.appdirdemo/cache/image/1507125270183.png //删除目录下所有文件
//FileUtils.deleteAllFile(AppDir.getInstance(this).IMAGE); //获取目录下第一个文件
//String pngPath = FileUtils.firstFile(AppDir.getInstance(this).IMAGE);
}
}
混淆配置
无
参考资料
暂时空缺
项目demo下载地址
暂不需要
AppDir【创建缓存目录】的更多相关文章
- AppDir【创建缓存目录】【建议使用这个工具类】
		
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 创建缓存目录 public static String APP_CACHE = "";// /storage/e ...
 - Android 缓存目录 Context.getExternalFilesDir()和Context.getExternalCacheDir()方法
		
一.基础知识 应用程序在运行的过程中如果需要向手机上保存数据,一般是把数据保存在SDcard中的.大部分应用是直接在SDCard的根目录下创建一个文件夹,然后把数据保存在该文件夹中.这样当该应用被卸载 ...
 - iOS开发——数据持久化Swift篇&文件目录路径获取(Home目录,文档目录,缓存目录等)
		
文件目录路径获取(Home目录,文档目录,缓存目录等) iOS应用程序只能在自己的目录下进行文件的操作,不可以访问其他的存储空间,此区域被称为沙盒.下面介绍常用的程序文件夹目录: 1,Home ...
 - Swift - 常用文件目录路径获取(Home目录,文档目录,缓存目录等)
		
当前位置: 首页 > 编程社区 > Swift > Swift - 常用文件目录路径获取(Home目录,文档目录,缓存目录等) Swift - 常用文件目录路径获取(Home目录,文 ...
 - Picasso自定义缓存目录
		
项目做完终于有点自己的时间了,就想看点源码涨涨姿势,那就看看Picasso这个牛逼哄哄的图片加载框架吧,当然这个也是自己最喜欢的图片加载框架. 实际项目中可能有需求自己定制图片的缓存目录,那么就需要自 ...
 - python tempfile 创建临时目录
		
一.tempfile介绍 该模块创建临时文件和目录.它适用于所有支持的平台.TemporaryFile,NamedTemporaryFile,TemporaryDirectory,和SpooledTe ...
 - MFC 创建多层目录
		
创建多层目录 BOOL CTestToolCtr::CreateFolder(CString strNewFolder) { /************************************ ...
 - php使用递归创建多级目录
		
<?php header('Content-type:text/html;charset=utf8'); echo "Loading time:".date('Y-m-d H ...
 - PHP判断文件夹是否存在和创建文件夹的方法(递归创建多级目录)
		
在开始之前,我先说明一下,可能许多朋友与我一样认为只要给一个路径,mkdir就可以创建文件夹,其实不是那样,单个的MKDIR只能创建一级目录,对于多级的就不行了,那如何用mkdir来创建呢?先我抄一段 ...
 
随机推荐
- python的加、减、乘、除、取整、取余计算
			
加法: 输入以下代码: >>>1+1 >>>1.0+1 减法: 输入以下代码: >>>1-2 >>>1.0-2 乘法: 输入以下 ...
 - 如何最简便的利用Python实现数据可视化?当然离不开matplotlib!
			
01|Figure和Subplot: matplotlib的图像全部在figure对象里面,就像是一片画布.figsize是figure的一个设置大小的属性.一个figure里面可以有无数个subpl ...
 - selenium 定位元素成功, 但是输入失败 (textarea)
			
问题描述 UI页面功能测试中, 定位元素并输入(通过sendKey()方法输入), 显示输入失败. 根本原因 为了修复一个bug, 这个元素从input改成了textarea, 而textarea是有 ...
 - BZOJ_2820_YY的GCD_莫比乌斯反演
			
BZOJ_2820_YY的GCD_莫比乌斯反演 题意&分析: 首先f[i]非积性,但可以通过μ处理,所以我们考虑线筛 f[i*p]=μ[i*p/p']; 1.当i为质数时f[i]=1; 2.当 ...
 - BZOJ_1060_时态同步_树形DP
			
BZOJ_1060_时态同步_树形DP 题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1060 分析:水水的树形DP. 用儿子的最大值更新父亲, ...
 - 将texlive带的字体安装进linux系统字体库
			
装机之后装系统,装完系统就装texlive,然后又遇一坑,编译以前的文档竟然找不到某字体: kpathsea:make_tex: Invalid fontname `FontAwesome Regul ...
 - 转载  python实例手册
			
python实例手册 #encoding:utf8# 设定编码-支持中文 0说明 手册制作: 雪松 更新日期: 2013-12-19 欢迎系统运维加入Q群: 198173206 # 加群请回答问题 请 ...
 - webpack Code Splitting浅析
			
Code Splitting是webpack的一个重要特性,他允许你将代码打包生成多个bundle.对多页应用来说,它是必须的,因为必须要配置多个入口生成多个bundle:对于单页应用来说,如果只打包 ...
 - vue客户端渲染首屏优化之道
			
提取第三方库,缓存,减少打包体积 1. dll动态链接库, 使用DllPlugin DllReferencePlugin,将第三方库提取出来另外打包出来,然后动态引入html.可以提高打包速度和缓存第 ...
 - 粮草先行——Android折叠屏开发技术点(二)
			
继该系列的第一篇和番外篇之后,今天我们来聊一聊多窗口开发的注意事项.实际上,与其说"多窗口开发",不如说让我们的APP适应多窗口模式. 可能有朋友会问,为什么要提到多窗口模式呢? ...