編輯:關於Android編程
前言:
在我們做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來進行文件存儲。首先我們在使用文件存儲的時候盡量做到以下幾點:
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年已經經歷過一次了,對於技術人員來說應該冷靜的看待這個問題,需要做的就是在寒冬裡播種希望,那就是學習。以此共勉之~
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持本站。
/** * Camera與Matrix的比較: * Camera的rotate()相關方法是指定某一維度上旋轉指定的角度。 * Matrix的rotate()相
看了這篇文章Android Studio如何查看資源或者函數在哪些類中被引用,知道了快捷鍵失效的原因,其中有一個原因就是快捷鍵沖突,那如何查看快捷鍵哪些項沖突了呢? A
一、利用普通的Adapter實現ListView列表——這是最基礎的適配器以下代碼是最普通的實現方法:1、MainActiviy.ja
微信網頁版怎麼看以前的聊天記錄?上班族寶寶們幾乎都會在網頁上進行微信聊天,微信網頁版比手機要方便得多,下文介紹微信網頁版查看聊天記錄方法,一起來和小編了解下