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)錯誤,請調(diào)整后重試哦。",Toast.LENGTH_SHORT).show(); } }
從網(wǎng)站建設(shè)到定制行業(yè)解決方案,為提供網(wǎng)站設(shè)計、成都網(wǎng)站制作服務(wù)體系,各種行業(yè)企業(yè)客戶提供網(wǎng)站建設(shè)解決方案,助力業(yè)務(wù)快速發(fā)展。成都創(chuàng)新互聯(lián)將不斷加快創(chuàng)新步伐,提供優(yōu)質(zhì)的建站服務(wù)。
參考文章:http://my.oschina.net/liucundong/blog/314520
在 2.x 版本中,Android設(shè)備都是單存儲,第三方App寫文件,必須申請 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,同時引入了 WRITE_MEDIA_STORAGE 權(quán)限來控制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。
舉例來說,如果應(yīng)用的包名是com.example.foo,那么外部存儲上的Android/data/com.example.foo/文件夾就可隨意訪問,其他任何地方都不允許寫,并且,存儲在自己包名相關(guān)的文件夾的文件,當(dāng)該應(yīng)用被卸載時候也會隨之被清除。
分情況來說:
只有外部存儲的設(shè)備
這種設(shè)備一般是android4.0之前的,只有一個存儲,不受這個規(guī)則限制,還是可以隨便讀寫,但如果你刷了4.4系統(tǒng),那么就只能寫自己包名相關(guān)的文件夾了。只有內(nèi)部存儲的設(shè)備
比如Nexus系列,sony L系列,不受這個規(guī)則限制,但是建議在自己的包名相關(guān)的文件夾寫數(shù)據(jù)。既有內(nèi)部存儲又有外部存儲
需要遵守這個規(guī)定,不能在外部存儲亂寫了,需要在自己的包名相關(guān)的文件夾寫數(shù)據(jù)。
Google做了這個限制后解決了這個問題:
隨便一個App,都會在/sdcard、/sdcard1 上建一個目錄,刪了也會重新建,即使被卸載,也會留下一些垃圾文件。
但是,也產(chǎn)生了一個問題:
類似于視頻、圖像處理這種想在外部存儲緩存大量音視頻文件,并且App被卸載后還想保留的,就沒辦法了。
作為一個程序員,想必你也很討厭App在SD卡根目錄亂建目錄吧,那就從我做起,來遵守Google的這一規(guī)定吧。
通過Context.getExternalFilesDir()方法可以獲取到 SDCard/Android/data/{package_name}/files/ ,儲存一些長時間保存的數(shù)據(jù);
通過Context.getExternalCacheDir()方法可以獲取到 SDCard/Android/data/{package_name}/cache/,儲存臨時緩存數(shù)據(jù);
這兩個目錄分別對應(yīng) 設(shè)置->應(yīng)用->應(yīng)用詳情里面的”清除數(shù)據(jù)“與”清除緩存“選項。
一個獲取外部存儲Cache的例子:
/**
* 獲取拓展存儲Cache的絕對路徑 * * @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
新聞名稱:Android筆記:存儲相關(guān),getExternalCacheDir,getExternalFilesDir,getExternalStorageDirectory等
網(wǎng)站地址:http://m.rwnh.cn/article16/jcjcdg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、全網(wǎng)營銷推廣、自適應(yīng)網(wǎng)站、微信公眾號、關(guān)鍵詞優(yōu)化、虛擬主機(jī)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)