android文件存儲初識

Android文件存儲

一, 當應用用到拍攝功能時,拍攝照片比較大,保存在數(shù)據(jù)庫不現(xiàn)實,必須保存在私有存儲空間,此空間也用來保存數(shù)據(jù)庫文件,將照片文件保存在databases子目錄相鄰的某個子目錄中,這就涉及到文件的存儲問題了,本文將簡單介紹android的文件存儲。
二,1,外部存儲目錄external與內部存儲目錄internal
內部存儲目錄:打開文件管理器,最外層的data目錄即為內部存儲目錄,內部都是app的包名,存儲著應用程序相關的數(shù)據(jù),例如 data/data/包名/(shared_prefs、database、files、cache),這里面的文件對未root用戶不可見,當用戶卸載App時,存儲在這里的數(shù)據(jù)也會被銷毀。
2,外部存儲目錄:和內部存儲目錄data同級的其他目錄基本都為外部存儲目錄,外部存儲目錄分為私有目錄和公有目錄,私有目錄存儲在android文件夾下,各應用數(shù)據(jù)存儲在對應以包為名的目錄下,這里的數(shù)據(jù)不同應用不可共享。與android目錄同級的目錄為公有目錄,這些目錄可以由我們自己創(chuàng)建。
三,應用內部存儲空間中的應用私有目錄和外部存儲空間中的應用私有目錄和區(qū)別。
3,如何獲取對應目錄呢?
(1)context.getFilesDir() 內部存儲data/data/包名/files目錄;
(2)context.getCacheDir() 內部存儲data/data/包名/cache目錄;
(3)Environment.getExternalStorageDirectory() 外部存儲根目錄 Environment.getExternalStoragePublicDirectory ();
(4)外部存儲公有目錄context.getExternalFilesDir() 外部存儲私有目錄storage/sdcard/Android/data/包名/files。一般存儲長時間保存的數(shù)據(jù)。
context.getExternalCacheDir() 外部存儲私有目錄storage/sdcard/Android/data/包名/cache。一般存儲臨時緩存數(shù)據(jù)。
4,內部存儲空間私有存儲空間:對于設備中每一個安裝的 App,系統(tǒng)都會在內部存儲空間的 data/data 目錄下以應用包名為名字自動創(chuàng)建與之對應的文件夾。這個文件夾用于 App 中的 WebView 緩存頁面信息,SharedPreferences 和 SQLiteDatabase 持久化應用相關數(shù)據(jù)等,普通用戶無法查看,應用卸載后所有文件被一同刪除。
5,外部存儲空間私有存儲空間:由于有些文件本身過大,不能全放在內部存儲空間,因為這樣會造成應用本身數(shù)據(jù)冗余,過大,所以提供外部存儲空間,普通用戶可以查看,應用卸載后文件依舊存在,

  1. Context 類提供了基本文件和目錄處理方法(存儲的文件僅供應用內部使用,此法足以)來處理獲取并操作內部存儲空間下應用私有目錄文件的方法。
    (1)File getFilesDir() 獲取/data/data/<包名>/files目錄。
    (2)FileInputStream openFileInput(String name):打開現(xiàn)有文件進行讀取

    (3)FileOutputStream openFileOutPutStream(String name,int mode): 打開文件進行寫入,如果不存在就創(chuàng)建它。
    (4)File getDir(String name,int mode)
    獲取/data/data/<包名>目錄的子目錄(不存在就創(chuàng)建它)。
    (5)String[] fileList()
    *獲取主文件目錄下的文件列表,可與其它方法配合使用,如openFileInput(String)>。
    (6)File getCacheDir() 獲取/data/data/<包名>/cache目錄,應及時清理該目錄,并節(jié)約使用。

  2. 有另一種情況,如果外部相機將拍攝的照片存在應用內部(這種情況屬于屬于其他應用讀寫本應用文件的情況)在這種情況下如果共享文件給其它應用或是接受其他應用文件,可通過ContentProvider把要共享的文件暴露出來,ContentProvider允許暴露內容URI給其它應用,其它應用就可以通過URI下載或向其寫入文件,同時讀寫可控。

  3. 如果只想從其它應用接收一個文件,自己實現(xiàn)ContentProvider就有點費力不討好了,此時可以使用一個便利類FileProvider,它是ContentProvider的一個子類,只要簡單的做做配置就可以,另外**從 7.0 開始,Android SDK 中的 StrictMode策略禁止開發(fā)人員在應用外部公開 file:// URI,如果我們在使用 file://URI 時忽視了這兩條規(guī)定,將導致用戶在 7.0 及更高版本系統(tǒng)的設備中使用到相關功能時,出現(xiàn) FileUriExposedException 異常,導致應用出現(xiàn)崩潰閃退問題。而這兩個過程的替代解決方案便是使用 FileProvider。FileProvider幫助我們將訪問受限的 file:// URI 轉化為可以授權共享的 content:// URI。

FileProvider的使用:
a. 聲明FileProvider為ContentProvider,并給予一定權限(及指定一個位置用來保存文件) 在AndroidManifest.xml中添加一個FileProvider聲明。

a.jpg

屬性介紹:
android:authorities: 標識內容提供器范圍內的數(shù)據(jù)URI的授權列表,有多個授權時,要用分號來分離每個授權.通常為應用包名+ContentProvier子類名稱。
android:exported=”false:意味著除了你自己以及你授權的人外其它人不能訪問你提供的FileProvider.
Android: grantUriPermission="true":此屬性給其它應用授權,容許向你指定的URI寫入文件。
Android:name :FileProvide所對應的包名。

b. 接下來配置FileProvider讓它知道該暴露哪些文件,在項目窗口右鍵單擊app.res目錄new->Android resource file,文件名輸入files,接下來將生成的xml文件內容修改為如下。


22.PNG

此配置文件把私有存儲空間的根路徑映射為crime_photos,這個名字只供FileProvider內部使用。
c. 接下來在AndroidManifest.xml中添加meta-data標簽,讓FileProvider能找到files.xml文件,在<provider>…</provider>之間加入如下內容


33PNG.PNG

好了,一切準備就緒,現(xiàn)在成功配置好了應用向外不提供的訪問路徑,此路徑有如下關系<files-path>路徑下的文件夾可以通過Context.getFilesDir()來訪問了。
此處只是對android文件存儲進行了簡單的介紹,第一次寫的不好勿噴,還望各位多多指點

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容