溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android筆記:存儲(chǔ)相關(guān),getExternalCacheDir, getExternalFilesDir,getExternalStorageDirectory等

發(fā)布時(shí)間:2020-06-10 14:42:59 來(lái)源:網(wǎng)絡(luò) 閱讀:7883 作者:glblong 欄目:移動(dòng)開發(fā)


File cacheDir = mContext.getExternalCacheDir();
if(null != cacheDir){
   mCacheDirPath = cacheDir.getAbsolutePath() + "/p_w_picpaths/";
}


if(TextUtils.isEmpty(mCacheDirPath)){
   if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){
      mCacheDirPath = Environment.getExternalStorageDirectory().getPath() + "/Android/data/com.meiyaapp.meiya/cache/p_w_picpaths/";
   }else{
      Toast.makeText(mContext,"SD卡狀態(tài)錯(cuò)誤,請(qǐng)調(diào)整后重試哦。",Toast.LENGTH_SHORT).show();
   }
}














參考文章:http://my.oschina.net/liucundong/blog/314520


Android應(yīng)用正確使用擴(kuò)展SD卡

先介紹一下Android的存儲(chǔ)

在 2.x 版本中,Android設(shè)備都是單存儲(chǔ),第三方App寫文件,必須申請(qǐng) WRITE_EXTERNAL_STORAGE 權(quán)限;

在4.0之后,Android設(shè)備開始有了內(nèi)置閃存,即 primary storage,并且可以外置SD卡,即 secondary external storage device;

WRITE_EXTERNAL_STORAGE 權(quán)限變成了僅僅控制 primary storage,同時(shí)引入了 WRITE_MEDIA_STORAGE 權(quán)限來(lái)控制secondary external storage device的操作。

到了Android 4.4 KitKat,WRITE_MEDIA_STORAGE 權(quán)限僅提供給系統(tǒng)應(yīng)用,不再授予第三方App。

關(guān)于 secondary external storage device 的寫操作也有了新規(guī)定。

Android的文檔是這么寫的:

Link: http://source.android.com/devices/tech/storage/index.html:

The WRITE_EXTERNAL_STORAGE permission must only grant write access to 
the primary external storage on a device. Apps must not be allowed to 
write to secondary external storage devices, except in their 
package-specific directories as allowed by synthesized permissions. 
Restricting writes in this way ensures the system can clean up files 
when applications are uninstalled.

翻譯: 
WRITE_EXTERNAL_STORAGE 權(quán)限,僅僅用于授權(quán)用戶寫 primary external storage,除了與自己包名相關(guān)的文件夾之外,應(yīng)用程序不允許寫secondary external storage devices。

舉例來(lái)說,如果應(yīng)用的包名是com.example.foo,那么外部存儲(chǔ)上的Android/data/com.example.foo/文件夾就可隨意訪問,其他任何地方都不允許寫,并且,存儲(chǔ)在自己包名相關(guān)的文件夾的文件,當(dāng)該應(yīng)用被卸載時(shí)候也會(huì)隨之被清除。

分情況來(lái)說:

  • 只有外部存儲(chǔ)的設(shè)備 
    這種設(shè)備一般是android4.0之前的,只有一個(gè)存儲(chǔ),不受這個(gè)規(guī)則限制,還是可以隨便讀寫,但如果你刷了4.4系統(tǒng),那么就只能寫自己包名相關(guān)的文件夾了。

  • 只有內(nèi)部存儲(chǔ)的設(shè)備 
    比如Nexus系列,sony L系列,不受這個(gè)規(guī)則限制,但是建議在自己的包名相關(guān)的文件夾寫數(shù)據(jù)。

  • 既有內(nèi)部存儲(chǔ)又有外部存儲(chǔ) 
    需要遵守這個(gè)規(guī)定,不能在外部存儲(chǔ)亂寫了,需要在自己的包名相關(guān)的文件夾寫數(shù)據(jù)。

Google做了這個(gè)限制后解決了這個(gè)問題:

隨便一個(gè)App,都會(huì)在/sdcard、/sdcard1 上建一個(gè)目錄,刪了也會(huì)重新建,即使被卸載,也會(huì)留下一些垃圾文件。

但是,也產(chǎn)生了一個(gè)問題:

類似于視頻、圖像處理這種想在外部存儲(chǔ)緩存大量音視頻文件,并且App被卸載后還想保留的,就沒辦法了。

開發(fā)中應(yīng)該怎么使用?

作為一個(gè)程序員,想必你也很討厭App在SD卡根目錄亂建目錄吧,那就從我做起,來(lái)遵守Google的這一規(guī)定吧。

通過Context.getExternalFilesDir()方法可以獲取到 SDCard/Android/data/{package_name}/files/ ,儲(chǔ)存一些長(zhǎng)時(shí)間保存的數(shù)據(jù);

通過Context.getExternalCacheDir()方法可以獲取到 SDCard/Android/data/{package_name}/cache/,儲(chǔ)存臨時(shí)緩存數(shù)據(jù);

這兩個(gè)目錄分別對(duì)應(yīng) 設(shè)置->應(yīng)用->應(yīng)用詳情里面的”清除數(shù)據(jù)“與”清除緩存“選項(xiàng)。

一個(gè)獲取外部存儲(chǔ)Cache的例子:

/**

  * 獲取拓展存儲(chǔ)Cache的絕對(duì)路徑  *  * @param context  */
 public static String getExternalCacheDir(Context context) {      if (!isMounted())           return null;

      StringBuilder sb = new StringBuilder();      File file = context.getExternalCacheDir();      // In some case, even the sd card is mounted,
      // getExternalCacheDir will return null
      // may be it is nearly full.

      if (file != null) {
           sb.append(file.getAbsolutePath()).append(File.separator);
      } else {
           sb.append(Environment.getExternalStorageDirectory().getPath()).append("/Android/data/").append(context.getPackageName())
                     .append("/cache/").append(File.separator).toString();
      }      return sb.toString();
 }

參考: 
https://plus.google.com/+TodLiebeck/posts/gjnmuaDM8sn 
http://blog.csdn.net/olevin/article/details/29575127 
http://source.android.com/devices/tech/storage/index.html













向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI