安卓主存儲
1. 安卓6.0系統怎麼默認存儲器為內存卡
如果你的設備存儲空間較低,這個功能會變得非常實用,特別是當你有一張大容量microSD卡時。可如果設備的存儲空間已經不小了,那麼在開啟這個功能時最好先想清楚。
當你首次插入SD卡時,系統會詢問你是將其當作外置還是內置存儲。如果選擇前者,那麼它的工作方式和任意外置存儲卡相同。你可以把應用數據、圖片、音樂和視頻放入其中以節約本地存儲空間。
但如果你選擇將其作為內置存儲使用,那它就會被格式化並加密。因此,你在這樣做之前應該先把存儲卡當中原本的內容進行備份。格式化之後,它便會成為設備的主存儲空間,至於原本的內置存儲空間,它並不會和存儲卡合並,而是會「消失不見」。當你進入存儲和USB選項時,只會看到如今被用作主存儲空間的 microSD卡。你依然可以將應用安裝在原來的內存空間當中,但照片和視頻不會被存儲在那裡。
雖然手機的內置存儲空間讀取速度要比外置MicroSD卡快得多,但是更大容量的手機價格也更加昂貴。所以如果沒有特殊的需求,使用外置存儲卡是解決手機空間問題的最佳途徑。
2. 怎麼更改安卓手機的默認存儲
1、首先打開手機主界面的設置功能。
3. 安卓的存儲機制
安卓的文件存儲分為內部存儲和外部存儲,在安卓早期,手機內置存儲很小,都是用於應用的私有存儲空間,外部存儲就是sdcard。往後發展,手機的內置存儲越來越大,同時也出現了一些不支持sdcard的手機。如今安卓的外部存儲已經不限於sdcard了。
內部存儲
手機內部存儲除了放置應用的私有和系統空間以外都為外部存儲,內部存儲空間有限。對於設備中每一個安裝的 App,系統都會在內部存儲空間的 data/data 目錄下以應用包名為名字自動創建與之對應的文件夾。這個文件夾用於 App 中的 WebView 緩存頁面信息,SharedPreferences 和 SQLiteDatabase 持久化應用相關數據等。
內部存儲包含的文件
外部存儲
在安卓文件的外部存儲部分又分為了應用的私有目錄和共有目錄。
私有目錄
外部的存儲的私有目錄地址可以根據context的相應方法得到。
公共目錄
外部的存儲的公有目錄可以根據Environment的相應方法得到。
創建文件測試
通過file創建data文件
Test 1
Filefile = newFile("data");
try{
//新建文件
booleanbl=file.createNewFile();
//判斷文件創建是否成功
Log.d("myTag","onCreate:"+bl);
}catch(IOExceptione){
e.printStackTrace();
}
運行結果
文件創建失敗
同時文件夾中沒有出現該文件
猜測創建失敗問題來自文件地址的問題
Test 2
Filefile=null;
file=newFile(getCacheDir()+"data");
try{
//新建文件
booleanbl=file.createNewFile();
//判斷文件創建是否成功
Log.d("myTag","onCreate:"+bl);
}catch(IOExceptione){
e.printStackTrace();
}
運行結果
文件創建成功,同時在/data/data/com.example.myapplication的地址處生成了名為cachedata的文件
文件名與預期不同
Test 3
Filefile=null;
file=newFile(getFilesDir()+"data");
try{
//新建文件
booleanbl=file.createNewFile();
//判斷文件創建是否成功
Log.d("myTag","onCreate:"+bl);
}catch(IOExceptione){
e.printStackTrace();
}
運行結果
創建了一個files文件夾及一個filesdata文件
filesdata文件位置:/data/data/com.example.myapplication/filesdata
Test 4
Filefile=null;
file=newFile(getCodeCacheDir()+"data");
try{
//新建文件
booleanbl=file.createNewFile();
//判斷文件創建是否成功
Log.d("myTag","onCreate:"+bl);
}catch(IOExceptione){
e.printStackTrace();
}
運行結果
code_cachedata地址:/data/data/com.example.myapplication/code_cachedata
Test 5
Filefile=null;
file=newFile(getCacheDir().getPath(),"data");
try{
//新建文件
booleanbl=file.createNewFile();
//判斷文件創建是否成功
Log.d("myTag","onCreate:"+bl);
}catch(IOExceptione){
e.printStackTrace();
}
運行結果
成功在cache文件下創建data文件
總結使用file類創建文件時需要詳細的地址,這里的地址可以通過context的getcacheDir()等方法得到
使用openFileinputStream創建
FileInputStreaminputStream=null;
try{
inputStream=openFileInput("data");
}catch(FileNotFoundExceptione){
e.printStackTrace();
}finally{
try{
inputStream.close();
}catch(IOExceptione){
e.printStackTrace();
}
新建了一個文件夾而沒有新建文件
將輸入流改為輸出流後
FileOutputStreamoutputStream=null;
try{
outputStream=openFileOutput("data",MODE_PRIVATE);
}catch(FileNotFoundExceptione){
e.printStackTrace();
}finally{
try{
outputStream.close();
}catch(IOExceptione){
e.printStackTrace();
}
成功創建文件
使用openfilexxxxstream在只輸入文件名進行創建文件時會默認在data/data/包名/files處創建文件,若不存在files文件則會新建一個files文件
File file = new File();
方法會讀取該文件地址的文件,如果沒有也不會報錯。
file.createNewFile();
會向該地址創建一個文件,返回一個bool值以判斷是否創建成功
openFileInputstream/openFileOutputstream都只能操作data/data/包名 處的文件
Tast 6
Filefile;
file=newFile(getExternalCacheDir(),"data");
try{
booleanbl=file.createNewFile();
Log.d("myTag","onCreate:"+bl);
}catch(IOExceptione){
e.printStackTrace();
}
需要讀寫公共空間操作有所區別
Filefile;
file=Environment.(Environment.DIRECTORY_DOWNLOADS);
FilemFile;
mFile=newFile(file,"data");
try{
booleanbl=mFile.createNewFile();
Log.d("myTag","onCreate:"+bl);
}catch(IOExceptione){
e.printStackTrace();
}
需要申明讀寫許可權對於android6.0以上還需要動態申請許可權
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE"/>
最後附上安卓所有文件存儲的地址的獲取方法
4. 安卓刷機包怎麼設置外置卡為主存儲器
安卓系統本身是不允許把應用程序直接裝在外置卡里的,只能直接裝到內置快閃記憶體里,再移走。
你想移到外置卡,是可以的。在手機的應用管理里,找到你要移的應用,點開管理頁面,就能看到移到SD卡等類似的選項。
另外,也可以通過第三方軟體,直接把應用裝到外卡上。但必須把手機連到電腦上安裝,比如豌豆莢、XX手機助手的PC版等。
但有要注意:
1、殺毒、鬧鍾、輸入法、微信、QQ等必須隨系統啟動的應用,不要移,移了就會有問題。
2、不是所有的程序都能移走。有些不讓移。
3、有些軟體可以移數據。比如高德地圖,在這個軟體裡面可以指定數據存在內卡還是外卡。
5. 安卓刷了cm11後主存儲如何改為外置SD卡
這個主意就是拍照的存儲吧,拍照的話可以到相機里找到存儲位置改成SD卡就可以了,裝的APP的話,如果支持到SD卡的話就有移動到SD卡的,如果不支持的話就只能是在內置存儲上了,這樣運行起來很快些,減少相應時間提高流暢度。
6. 安卓4.0怎麼把手機內存調回主存儲
在手機中找到設置選項->存儲->有個外置SD卡模式(設置外置SD卡為只存儲設備),你這這里就能改回去了。
7. 安卓內外部存儲完全解析 -- 別再弄混了
安卓開發離不開手機存儲,然而大部分人對於安卓開發中的存儲概念存在誤區,內部外部SD卡傻傻分不清?
以下引用來自對 官方文檔 的理解
呵呵呵,先別說話,然而重點來了(敲黑板),按照官方的說法,
內部存儲是指系統的存儲空間,沒有root是訪問不到的呦親,比如sharedPreferenced或者database都是保存在這裡面的。
外部存儲,又分為 2 部分:
然而現實中,常常有同事把手機那個32G,64G存儲叫做內部存儲= =,寶寶好累,人家明明是 ExternalStorage !!
希望本篇能讓大家對內外部存儲有一個正確鮮明的認識
getFilesDir()
路徑如下
文檔 雲:若想操作該路徑,你需要一個輸出流:
就像這樣:
注: this 是 context 對象
在
路徑下會看到新文件哦
如果你還想讀取的話, 文檔 雲:你需要一個輸入流:
Log如下
getCacheDir()
文檔 雲:
路徑如下:
特別的,還有getDir() :
getDir("- -!.txt", Context.MODE_PRIVATE).getAbsolutePath()
路徑如下:
app_是系統自己加上去的
內部存儲就是系統的存儲,沒有root你是看不到的,內部存儲最大特點就是可以用Context對象調用各個獲取路徑的方法。比如: context.fileList()
那就是
下的文件遍歷。
而 deleteFile("ABC") 就是
刪除下名為 ABC 的文件
</br></br></br>
操作外部存儲你首先需要以下許可權
當你申請了write許可權,那麼read許可權默認也就通過啦
再判斷狀態:
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState))
Environment.getExternalStorageDirectory()
這個路徑根據手機廠家不同會有些許變化
直接傳入 Environment 中的常量獲取相應的路徑,如下:
Environment.(Environment.DIRECTORY_ALARMS));
或者
Environment.(Environment.DIRECTORY_PICTURES));
公有目錄下,系統會區分不同類別 (例如鈴聲在系統設置中顯示為鈴聲而不是音樂)
4.4以後訪問該目錄不再需要許可權了
getExternalFilesDir(String type)
eg.
getExternalFilesDir(Environment.DIRECTORY_MUSIC)
特別的:ContextCompat下的
ContextCompat.getExternalFilesDirs(context,type)
返回一個File[],在4.4以後第一條數據默認外部主存儲目錄,第二條數據就是sd卡路徑啦,但是注意4.4之前是沒有第二條數據的哦
該目錄下的特點是卸載程序後,該目錄和其下所有文件均會被刪除
getExternalCacheDir()
注意,使用該目錄注意管理空間,你不能等系統幫你清理,而是自己清理不再需要的緩存
特別的:ContextCompat下的
ContextCompat.getExternalCacheDirs()
道理同上
發現特點了嗎朋友,無論外部內部,只有路徑中有包名,那麼就是私有的,而且是隨著程序的卸載而被刪除的, 有包名的路徑均是Context中的方法,而公有的路徑均是Environment調用的
這個貨真真是要了老命,一般的方法根部不好使,結合網上有的方法加上公司項目中的方法,總結如下:
百分百好用的獲取SD卡路徑方法:
最後集合 path 中的值就是SD卡根目錄
雖然無視版本百分百好用,但是如果你的手機有SD卡槽卻沒插SD卡,該方法最後 path 返回的是 null ,也就是說該方法無法判斷到底是沒插SD卡還是根本不支持SD卡
其實還有一種方法
String path = System.getenv("SECONDARY_STORAGE");
該方法只要你手機支持SD卡,無論你插沒插SD卡,均會返回SD卡路徑,但是 6.0及以上該方法被移除
Environment中源碼其實就是根據這個方法獲取路徑的
安卓官方文檔大家一定要看,他就是我們開發者的權威呀,聖經呀!!