kotlin關(guān)于讀取文件路徑問題

前言,因為需要寫一個播放器測試,需要讀取到手機(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)廢棄,但是還是很好用。暫時無法找新的方法代替,有新的再更新。

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

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容