前言,因為需要寫一個播放器測試,需要讀取到手機(jī)文件路徑以獲取到mp4格式文件的路徑,進(jìn)而播放,發(fā)現(xiàn)網(wǎng)絡(luò)上的大多有問題,這里寫下以作筆記記錄。
1.存儲方式分為三部分:
SharePreferences外部存儲器內(nèi)部存儲器
0.File的path、absolutePath和canonicalPath的區(qū)別
先理解,路徑、絕對路徑/相對路徑、規(guī)范路徑
/**
*第一類:路徑、絕對路徑、規(guī)范路徑c:\temp\file.txt
*第二類:路徑、相對路徑:.\file.txt
*第三類:路徑、絕對路徑:c:\temp\MyApp\bin\..\..\file.txt
*/
總結(jié):路徑包含絕對路徑/相對路徑,絕對路徑包含規(guī)范路徑,而相對路徑不包含規(guī)范路徑。
-
path:返回給用戶創(chuàng)建File的路徑。 -
absolutePath:絕對路徑? -
canonicalPath“”:規(guī)范路徑
真實返回:
getFilesDir.absolutePath: /data/user/0/com.qchemmo.testdemo1/files
getFilesDir.path: /data/user/0/com.qchemmo.testdemo1/files
getFilesDir.canonical: /data/data/com.qchemmo.testdemo1/files
1.SharePreferences
(待寫)
2.外部存儲器
參考http://www.itdecent.cn/p/343b1daf16a0
externalCacheDir
* (1)外部存儲
* (2)獲取外部存儲中當(dāng)前應(yīng)用程序下的cache目錄的路徑(/storage/emulated/0/Android/data/com.xxx.ooo.filetestdemo/cache)
* (3)不需要額外的權(quán)限來讀取或在返回的路徑下寫入文件
* (4)當(dāng)應(yīng)用被卸載時,文件數(shù)據(jù)被清除
* (5)一般情況下,非root手機(jī)可以訪問
* * * * * * * * * * * * * 分割線* * * * * * * * * * * * * *
* (6)實際請求時,由于必須使用?。〔挪粓箦e,如果cache目錄不存在,將會被創(chuàng)建
*
getExternalCacheDirs(廢棄?)
externalFilesDir
* (1)外部存儲
* (2)獲取外部存儲中當(dāng)前應(yīng)用程序下的files目錄中的type文件夾的路徑(/storage/emulated/0/Android/data/com.xxx.ooo.filetestdemo/files/aa)
* (3)不需要額外的權(quán)限來讀取或在返回的路徑下寫入文件
* (4)當(dāng)應(yīng)用被卸載時,文件數(shù)據(jù)被清除
* (5)一般情況下,非root手機(jī)可以訪問
externalFilesDirs:kotlin是需要文件夾?
* (1)和getExternalFilesDir類似,getExternalFilesDirs獲取所有內(nèi)置存儲器的files目錄下的aa文件夾
* (2)Android4.4新增接口
getExternalStoragePublicDirectory廢棄
雖然被棄用,但是仍舊可以使用,并且好用,但是必須獲取READ_EXTERNAL_STORAGE,在AndroidManifest.xml加入
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
getExternalStorageDirectory廢棄
getExternalStorageState
* 獲取存儲狀態(tài)(媒體是指外部存儲,比如SD卡)
*
* MEDIA_UNKNOWN:未知存儲狀態(tài),例如路徑?jīng)]有由已知存儲支持時
* MEDIA_REMOVED:存儲媒體被移除
* MEDIA_UNMOUNTED:存儲媒體沒有掛載
* MEDIA_CHECKING:如果媒體存在并正在檢查磁盤
* MEDIA_NOFS:不支持的文件系統(tǒng)
* MEDIA_MOUNTED:媒體已經(jīng)掛載,并且可讀/寫
* MEDIA_MOUNTED_READ_ONLY:媒體已經(jīng)掛載,只讀
* MEDIA_SHARED:在通過USB共享
* MEDIA_BAD_REMOVAL:在沒有掛載前存儲媒體已經(jīng)被移除
* MEDIA_UNMOUNTABLE:存儲媒體無法掛載
* MEDIA_EJECTING:存儲媒體處于被彈出的過程
*
* 其中MEDIA_MOUNTED最常用,可以判斷媒體是否存在,如果不存在可以將數(shù)據(jù)存儲到內(nèi)部存儲中
* boolean isSDCardExist = Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());
StorageManager
StorageManager sm = (StorageManager)CustomApplication.getInstance().getSystemService(Context.STORAGE_SERVICE);
Path paths = (String[]) sm.getClass().getMethod("getVolumePaths", null).invoke(sm, null);
* 獲取所有的外部存儲路徑
* 比如:/storage/emulated/0、/storage/usbotg、/storage/0000-0000
3.內(nèi)部存儲器
content.filesDir
* (1)內(nèi)部存儲
* (2)獲取內(nèi)部存儲中當(dāng)前應(yīng)用程序下的files目錄的路徑
* (其路徑為/data/data/com.xxx.ooo.filetestdemo/files有些手機(jī)的路徑為/data/user/0/com.xxx.ooo.filetestdemo/files)
* (3)個別設(shè)備雖然獲取內(nèi)部存儲的路徑貌似不同,其實最終都是映射在同一個路徑下。比如/data/data/對應(yīng)的映射路徑是data/user/0/
* (4)不需要額外的權(quán)限來讀取或在返回的路徑下寫入文件
* (5)當(dāng)應(yīng)用被卸載時,文件數(shù)據(jù)被清除
* (6)一般情況下,非root手機(jī)不能訪問
* * * * * * * * * * * * * 分割線* * * * * * * * * * * * * *
* (7)事實證明,即使路徑正確,確實不能直接訪問(獲?。浚├锩娴男畔?。
* (8)關(guān)于(2),filesDir.canonicals為前者,filesDir.absolutePath和
* filesDir.path為后者
cacheDir
* (1)內(nèi)部存儲
* (2)獲取內(nèi)部存儲中當(dāng)前應(yīng)用程序下的cache目錄的路徑
* (其路徑為/data/data/com.xxx.ooo.filetestdemo/cache有些手機(jī)的路徑為/data/user/0/com.xxx.ooo.filetestdemo/cache)
* (3)個別設(shè)備雖然獲取內(nèi)部存儲的路徑貌似不同,其實最終都是映射在同一個路徑下。比如/data/data/對應(yīng)的映射路徑是data/user/0/
* (4)不需要額外的權(quán)限來讀取或在返回的路徑下寫入文件
* (5)當(dāng)該文件夾超過當(dāng)前被分配的最大緩存時,系統(tǒng)將自動刪除該目錄中的文件為其他地方提供需要空間,當(dāng)未超出時則不會
* (6)當(dāng)應(yīng)用被卸載時,文件數(shù)據(jù)被清除
* (7)一般情況下,非root手機(jī)不能訪問
* * * * * * * * * * * * * 分割線* * * * * * * * * * * * * *
* (7)直接查看手機(jī),是沒有cache這個文件夾,而files是真實存在的
nobackupFiles
* (1)內(nèi)部存儲
* (2)不會自動備份到遠(yuǎn)程存儲的應(yīng)用程序文件的路徑
* (3)獲取內(nèi)部存儲中當(dāng)前應(yīng)用程序下的no_backup目錄的路徑
* (其路徑為/data/data/com.xxx.ooo.filetestdemo/no_backup有些手機(jī)的路徑為/data/user/0/com.xxx.ooo.filetestdemo/no_backup)
* (4)個別設(shè)備雖然獲取內(nèi)部存儲的路徑貌似不同,其實最終都是映射在同一個路徑下。比如/data/data/對應(yīng)的映射路徑是data/user/0/
* (5)不需要額外的權(quán)限來讀取或在返回的路徑下寫入文件
* (6)當(dāng)應(yīng)用被卸載時,文件數(shù)據(jù)被清除
* (7)一般情況下,非root手機(jī)不能訪問
* (8)Android 5.0新增接口,低于5.0手機(jī)不支持
codeCacheDir
* (1)內(nèi)部存儲
* (2)保存應(yīng)用程序代碼緩存文件的目錄路徑,適合在運行時存放應(yīng)用產(chǎn)生的編譯或者優(yōu)化的代碼。
* (3)獲取內(nèi)部存儲中當(dāng)前應(yīng)用程序下的code_cache目錄的路徑
* (其路徑為/data/data/com.xxx.ooo.filetestdemo/code_cache有些手機(jī)的路徑為/data/user/0/com.xxx.ooo.filetestdemo/code_cache)
* (4)個別設(shè)備雖然獲取內(nèi)部存儲的路徑貌似不同,其實最終都是映射在同一個路徑下。比如/data/data/對應(yīng)的映射路徑是data/user/0/
* (5)不需要額外的權(quán)限來讀取或在返回的路徑下寫入文件
* (6)當(dāng)應(yīng)用被卸載時,文件數(shù)據(jù)被清除
* (7)一般情況下,非root手機(jī)不能訪問
* (8)Android 5.0新增接口,低于5.0手機(jī)不支持
datadir
* (1)內(nèi)部存儲
* (2)獲取內(nèi)部存儲中當(dāng)前應(yīng)用程序路徑
* (其路徑為/data/data/com.xxx.ooo.filetestdemo有些手機(jī)的路徑為/data/user/0/com.xxx.ooo.filetestdemo)
* (3)個別設(shè)備雖然獲取內(nèi)部存儲的路徑貌似不同,其實最終都是映射在同一個路徑下。比如/data/data/對應(yīng)的映射路徑是data/user/0/
* (4)不需要額外的權(quán)限來讀取或在返回的路徑下寫入文件
* (5)當(dāng)應(yīng)用被卸載時,文件數(shù)據(jù)被清除
* (6)一般情況下,非root手機(jī)不能訪問
* (7)Android 7.0新增接口,低于7.0手機(jī)不支持
packageCodePath
* (1)內(nèi)部存儲
* (2)此上下文的主Android包的完整路徑。這對應(yīng)用程序通常沒有用處,因為它們不應(yīng)該直接訪問文件系統(tǒng)
* (其路徑為/data/app/com.xxx.ooo.filetestdemo-1PN4Y-p3v7XA-OqXnbud8A==/base.apk)
* (3)不需要額外的權(quán)限來讀取或在返回的路徑下寫入文件
* (4)當(dāng)應(yīng)用被卸載時,文件數(shù)據(jù)被清除
* (5)一般情況下,非root手機(jī)不能訪問
packageResourcePath(廢棄?)
* 和packageCodePath一致
dataDirectorykotlin里是datadir
* (1)內(nèi)部存儲
* (2)其路徑為/data
* (3)如果寫文件需要data文件夾讀寫權(quán)限,不過即使將文件夾的文件設(shè)置成可讀可寫權(quán)限,Android的createNewFile方法還是報權(quán)限錯誤(這個問題待定吧)
* (4)不過一般app開發(fā)不需要讀寫/data目錄中的文件
* (5)一般情況下,非root手機(jī)不能訪問
downloadCacheDirectory(廢棄?)
* (1)內(nèi)部存儲
* (2)其路徑為/data/cache
* (3)如果寫文件需要data文件夾讀寫權(quán)限,不過即使將文件夾的文件設(shè)置成可讀可寫權(quán)限,Android的createNewFile方法還是報權(quán)限錯誤(這個問題待定吧)
* (4)不過一般app開發(fā)不需要讀寫/data目錄中的文件
* (5)一般情況下,非root手機(jī)不能訪問
rootDirectory(廢棄?)
* (1)獲取系統(tǒng)目錄
* (2)其路徑為/system
* (3)該文件夾只讀權(quán)限,不可寫
* (4)一般情況下,非root手機(jī)不能訪問
總結(jié)
還是getExternalStoragePublicDirectory雖然已經(jīng)廢棄,但是還是很好用。暫時無法找新的方法代替,有新的再更新。