版權聲明:本文為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; } }

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; } }
在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下載地址
暫不需要