詳解Android數(shù)據(jù)存儲(chǔ)之Android 6.0運(yùn)行時(shí)權(quán)限下文件存儲(chǔ)的思考
前言:
在我們做App開(kāi)發(fā)的過(guò)程中基本上都會(huì)用到文件存儲(chǔ),所以文件存儲(chǔ)對(duì)于我們來(lái)說(shuō)是相當(dāng)熟悉了,不過(guò)自從Android 6.0發(fā)布之后,基于運(yùn)行時(shí)權(quán)限機(jī)制訪問(wèn)外置sdcard是需要?jiǎng)討B(tài)申請(qǐng)權(quán)限,所以以往直接sdcard根目錄上直接新建了一個(gè)xxx/cache/目錄來(lái)做文件存儲(chǔ)就會(huì)不是那么容易控制了,所以有必要重新認(rèn)識(shí)一下Android文件存儲(chǔ)的相關(guān)知識(shí)了。
背景:
有關(guān)外置sdcard的讀寫(xiě)權(quán)限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
在Android 6.0 之前只要申明了上述兩個(gè)權(quán)限就可以放心大膽的在sdcard上進(jìn)行讀寫(xiě)了,可惜Android 6.0之后就需要?jiǎng)討B(tài)申請(qǐng)讀寫(xiě)權(quán)限了,所以我們?cè)撊绾芜m配Android 6.0來(lái)進(jìn)行文件存儲(chǔ)。首先我們?cè)谑褂梦募鎯?chǔ)的時(shí)候盡量做到以下幾點(diǎn):
- 不要隨意占用用戶的內(nèi)置存儲(chǔ)
- 不要隨意在SD卡上新建目錄,應(yīng)該放置自己應(yīng)用包名對(duì)應(yīng)的擴(kuò)展存儲(chǔ)目錄下,卸載App時(shí)可以被自動(dòng)清除。
- 對(duì)占用的磁盤(pán)空間有上限,并按照一定的策略進(jìn)行清除,比如DiskLru算法等。
Android文件存儲(chǔ)目錄:
1.)應(yīng)用私有存儲(chǔ)(內(nèi)置存儲(chǔ))
| 訪問(wèn)方式 | 詳細(xì)路徑 | 是否需要申請(qǐng)權(quán)限 |
|
Context.getFileDir();獲取內(nèi)置存儲(chǔ)下的文件目錄,可以用來(lái)保存不能公開(kāi)給其他應(yīng)用的一些敏感數(shù)據(jù)如用戶個(gè)人信息 |
/data/data/應(yīng)用包名/files/ | 否 |
|
Context.getCacheDir();獲取內(nèi)置存儲(chǔ)下的緩存目錄,可以用來(lái)保存一些緩存文件如圖片,當(dāng)內(nèi)置存儲(chǔ)的空間不足時(shí)將系統(tǒng)自動(dòng)被清除 |
/data/data/應(yīng)用包名/cache/ | 否 |
注意:
由于這里使用的是Android 手機(jī)內(nèi)置存儲(chǔ),如果手機(jī)沒(méi)有獲得root權(quán)限的話文件瀏覽器是無(wú)法訪問(wèn)的,同樣這種存儲(chǔ)也會(huì)隨之a(chǎn)pp被刪除而被刪除。
2.)應(yīng)用擴(kuò)展存儲(chǔ)(SD卡)
| 訪問(wèn)方式 | 路徑詳情 | 是否需要申請(qǐng)權(quán)限 |
|
|
SDCard/Android/data/應(yīng)用包名/files/ |
API < 19:是 API >= 19:否 |
|
|
SDCard/Android/data/應(yīng)用包名/cache/ |
API < 19:是 API >= 19:否 |
注意:
由于存儲(chǔ)在sdcard上所以盡量不要存在敏感數(shù)據(jù)比如用戶信息等,這里的文件也會(huì)隨著app 被刪除而被刪除。
3.)公共存儲(chǔ)(SD卡)
| 訪問(wèn)方式 | 路徑詳情 | 是否需要申請(qǐng)權(quán)限 |
| Environment.getExternalStorageDirectory();獲取sdcard根目錄 | SDCard/xxx文件夾名字/ | 是 |
注意:
有時(shí)我們也是需要存儲(chǔ)一些公共文件,而且希望這些文件能夠不隨著App被刪除而被刪除,例如我們錄制的視頻或者下載的音樂(lè)等。由于這個(gè)目錄可以被任何app訪問(wèn),所以我們?cè)谑褂玫臅r(shí)候是需要申請(qǐng)權(quán)限的。
兼容Android 6.0 文件緩存實(shí)現(xiàn)
前提:這里主要處理一些非永久保存數(shù)據(jù),需要永久保存的數(shù)據(jù)盡量還是要選擇sdcard 公共存儲(chǔ)方式的。
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.)獲取指定功能的目錄
/**
* 獲取相關(guān)功能業(yè)務(wù)目錄
*
* @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();
}
在日常開(kāi)發(fā)過(guò)程中,我們需要不同的文件放在不同的目錄下,比如:log日志文件需要放在log文件下,就可以通過(guò)上面的方法傳入“l(fā)og”獲取該業(yè)務(wù)功能的文件夾。
3.)獲取指定功能文件路徑
/**
* 獲取log日志根目錄
* @return
*/
public static String getLogDir(){
return getDiskCacheDir(LOG);
}
/**
* 根據(jù)logName 獲取log文件全路徑
* @param logName
* @return
*/
public static String getLogFilePath(String logName){
return getLogDir()+logName;
}
總結(jié):
今天總結(jié)了Android的文件存儲(chǔ)及在6.0上的適配問(wèn)題,最近突然覺(jué)得自己有太多的知識(shí)需要學(xué)習(xí)了,也許由于現(xiàn)在的經(jīng)濟(jì)大環(huán)境導(dǎo)致互聯(lián)網(wǎng)遇到了資本寒冬了,其實(shí)對(duì)于我來(lái)說(shuō)2012年已經(jīng)經(jīng)歷過(guò)一次了,對(duì)于技術(shù)人員來(lái)說(shuō)應(yīng)該冷靜的看待這個(gè)問(wèn)題,需要做的就是在寒冬里播種希望,那就是學(xué)習(xí)。以此共勉之~
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android實(shí)現(xiàn)文件存儲(chǔ)并讀取的示例代碼
- android數(shù)據(jù)存儲(chǔ)之文件存儲(chǔ)方法
- android開(kāi)發(fā)基礎(chǔ)教程—文件存儲(chǔ)功能實(shí)現(xiàn)
- Android圖片添加水印圖片并把圖片保存到文件存儲(chǔ)的實(shí)現(xiàn)代碼
- 實(shí)例詳解Android文件存儲(chǔ)數(shù)據(jù)方式
- 詳解Android開(kāi)發(fā)數(shù)據(jù)持久化之文件存儲(chǔ)(附源碼)
- Android學(xué)習(xí)之文件存儲(chǔ)讀取
- 詳解Android文件存儲(chǔ)
- Android編程之SharedPreferences文件存儲(chǔ)操作實(shí)例分析
- Android開(kāi)發(fā)文件存儲(chǔ)實(shí)例
相關(guān)文章
Android編程之殺毒的實(shí)現(xiàn)原理及具體實(shí)例
這篇文章主要介紹了Android編程之殺毒的實(shí)現(xiàn)原理及具體實(shí)例,結(jié)合實(shí)例形式分析了Android殺毒功能的原理與簡(jiǎn)單實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-12-12
Android 斷點(diǎn)下載和自動(dòng)安裝的示例代碼
本篇文章主要介紹了Android斷點(diǎn)下載和自動(dòng)安裝的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
Android?上實(shí)現(xiàn)DragonBones換裝功能
這篇文章主要介紹了Android?上實(shí)現(xiàn)DragonBones換裝功能,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-06-06
Android App中使用Pull解析XML格式數(shù)據(jù)的使用示例
這篇文章主要介紹了Android App中使用Pull解析XML格式數(shù)據(jù)的使用示例,Pull是Android中自帶的XML解析器,Java里也是一樣用:D需要的朋友可以參考下2016-04-04
ViewPager實(shí)現(xiàn)漂亮的引導(dǎo)頁(yè)
這篇文章主要為大家詳細(xì)介紹了ViewPager實(shí)現(xiàn)漂亮的引導(dǎo)頁(yè),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
Android中關(guān)于自定義相機(jī)預(yù)覽界面拉伸問(wèn)題
這篇文章主要為大家詳細(xì)介紹了Android中關(guān)于自定義相機(jī)預(yù)覽界面拉伸問(wèn)題,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02
Android編程判斷橫屏、豎屏及設(shè)置橫豎屏的方法
這篇文章主要介紹了Android編程判斷橫屏、豎屏及設(shè)置橫豎屏的方法,結(jié)合實(shí)例形式分析了Android針對(duì)橫豎屏的判斷、計(jì)算、設(shè)置等相關(guān)操作技巧,需要的朋友可以參考下2018-01-01
Android開(kāi)發(fā)手冊(cè)TextView屬性實(shí)現(xiàn)效果盤(pán)點(diǎn)
這篇文章主要為大家介紹了Android開(kāi)發(fā)手冊(cè)TextView屬性實(shí)現(xiàn)的效果盤(pán)點(diǎn)及使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Android 實(shí)現(xiàn)仿支付寶的密碼均分輸入框
這篇文章主要介紹了Android 實(shí)現(xiàn)仿支付寶的密碼均分輸入框的相關(guān)資料,需要的朋友可以參考下2017-06-06

