溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android Day02-文件操作-登陸示例

發(fā)布時(shí)間:2020-07-15 16:51:38 來(lái)源:網(wǎng)絡(luò) 閱讀:440 作者:屠夫章哥 欄目:移動(dòng)開(kāi)發(fā)

需求:登陸


第1步:搭建UI

????采用混合布局,布局搭建好之后如下所示:

????Android Day02-文件操作-登陸示例

第2步:準(zhǔn)備工作

????根據(jù)javaWeb中的mvc+dao的開(kāi)發(fā)模式,創(chuàng)建好包名和類。

????Android Day02-文件操作-登陸示例

第3步:業(yè)務(wù)邏輯

????就是一個(gè)存值和取值的過(guò)程,也可以說(shuō)是讀寫(xiě)文件的過(guò)程。

????注意在獲取路徑的時(shí)候,不要使用硬性編碼(hardcode)。



關(guān)鍵知識(shí)點(diǎn)梳理:

???Android Day02-文件操作-登陸示例?

????▇獲取應(yīng)用程序的files私有目錄:"/data/data/應(yīng)用程序包名/files"

? ? ? ? ?方式1:得路徑,再得到流。

????????????File?context.getFilesDir()

? ? ?<-- ?補(bǔ)充一下 File?context.getCacheDir()????表示得到緩存目錄/caches-->

????? ? 方式2:直接得到流

? ? ? ? ? ?文件讀取流:InputStream in = context.openFileInput("文件名(帶后綴)");? ? ????

? ? ? ? ? ?文件寫(xiě)入流:OutputStream out ?= context.openFileOutput("user.txt", ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Context.MODE_PRIVATE);//有2個(gè)參數(shù),第2個(gè)參數(shù)

????????????????????????表示文件的權(quán)限。

????????

? ? ? ? ? ??

????▇獲取設(shè)備的SD卡目錄:

????????→1.注意要配置sd的訪問(wèn)權(quán)限。

????????????Android Day02-文件操作-登陸示例

????????→2.判斷sd卡的狀態(tài)。????

????????????

String?storageState?=?Environment.getExternalStorageState();
if(!storageState.equals(Environment.MEDIA_MOUNTED))
{
????//如果掛起,提示用戶sd卡不存在。
	Toast.makeText(mainContext,?"sd卡不存在",?Toast.LENGTH_SHORT).show();
	return;
}

????????→3.判斷sd卡空間容量信息。

????????

//假如SD卡小于200M就提示內(nèi)存不足
//首先獲取外部存儲(chǔ)的目錄?File對(duì)象
	File?file_storage?=?Environment.getExternalStorageDirectory();
//通過(guò)File對(duì)象來(lái)獲得外部存儲(chǔ)的可用空間
	Long?useable_storage?=?file_storage.getUsableSpace();
	//將字節(jié)轉(zhuǎn)換成易于閱讀的M表示方法
????????String?useable_storage_mstr?=?Formatter.formatFileSize(mainContext,useable_storage);
		????????		
//得到外部存儲(chǔ)的總空間
	Long?total_storage?=?file_storage.getTotalSpace();
	String?total_storage_mstr?=?Formatter.formatFileSize(mainContext,?total_storage);
????????if(useable_storage?<?1024*1024*200)
	{
		Toast.makeText(mainContext,?"外部存儲(chǔ)空間不足,剩余可用空間為:"
		????????	+?useable_storage_mstr?+"M"??
		????????	+?",總空間為:"?+?total_storage_mstr?+?"M"
		????????	,?Toast.LENGTH_LONG).show();
		return;
	}

????????通過(guò)linux命令df /sdcard來(lái)獲得外部設(shè)備外部存儲(chǔ)的信息:

????????Android Day02-文件操作-登陸示例

?????▇獲取資產(chǎn)文件夾Asset目錄下的文件輸入流:

????????

//獲取上下文的所有資源對(duì)象
Resources?res?=?context.getResources();
//從資源對(duì)象中獲取資產(chǎn)目錄Asset的管理器AssetManager
AssetManager?manager?=?res.getAssets();
//利用管理器的open方法獲取它的目錄下指定文件的讀取流
InputStream?in?=?manager.open("user.txt");

????????

????????另外一種實(shí)現(xiàn)方式:

mContext.getAssets().open("sdk.properties")

????????

?▇Preferences:"/data/data/應(yīng)用程序包名/shared_prefs"

????? ?用于存放一些簡(jiǎn)單的標(biāo)記信息、設(shè)置信息。通過(guò)xml文件在實(shí)現(xiàn)保存和取出。

??????PreferenceManager.getDefaultSharedPreferences 此方法獲取的xml為“應(yīng)用程序包名_preferences.xml"文件。

??????


????? ? ?

???? ? Preferences存儲(chǔ)文件流程

//第1步:通過(guò)上下文對(duì)象得到SharedPreferences對(duì)象
????????SharedPreferences?user_pref?=??context.getSharedPreferences("user.txt",?Context.MODE_PRIVATE);
//第2步:得到SharedPreferences的Editor對(duì)象
	Editor?user_editor?=?user_pref.edit();
//第3步:通過(guò)Editor向SharedPreferences對(duì)象里面設(shè)置值,類似map中的鍵和值?。
	user_editor.putString("username",?user.getUsername());?
	user_editor.putString("password",?user.getPassword());
//第4步:提交Editor
	return?user_editor.commit();

??????Preferences讀取文件內(nèi)容

//第1步:通過(guò)上下文對(duì)象得到SharedPreferences對(duì)象
????????SharedPreferences?user_share?=?context.getSharedPreferences("user.txt",?Context.MODE_PRIVATE);
//第2步:得到share對(duì)象的數(shù)據(jù)
	String?username?=?user_share.getString("username",?"用戶名找不到");
	String?password?=?user_share.getString("password",?"密碼找不到");?
	//上面getString方法的第二個(gè)參數(shù)為找不到指定鍵名的時(shí)候返回的缺省值。

????

????通過(guò)總結(jié)可以發(fā)現(xiàn),上面的這些文件讀取流,都只能讀取當(dāng)前應(yīng)用程序的私有目錄下的文件流,有局限性。如果要想跨應(yīng)用讀取數(shù)據(jù),還是得結(jié)合一般IO流。


????今天還講了XML的解析和序列化,和javaWeb中的xml的解析及序列化十分的相似,只是獲取解析器和序列器的方式稍有不同,是通過(guò)Xml這個(gè)類直接獲取的。


? ? ▇讀取properties文件亂碼:

??????properties里是不能直接寫(xiě)中文的,中文需要轉(zhuǎn)碼成unicode編碼,也就是以\u開(kāi)頭的。

?

Excel導(dǎo)出? ? ? ?

????????????https://blog.csdn.net/kangweijian/article/details/86694670 ?





Android 開(kāi)發(fā)時(shí)如何正確獲取使用擴(kuò)展存儲(chǔ)路徑

????http://http://my.oschina.net/liucundong/blog/314520

????

????作為一個(gè)程序員,想必你也很討厭App在SD卡根目錄亂建目錄吧,那就從我做起,來(lái)遵守Google的這一規(guī)定吧。

????通過(guò)Context.getExternalFilesDir()方法可以獲取到 SDCard/Android/data/{package_name}/files/ ,儲(chǔ)存一些長(zhǎng)時(shí)間保存的數(shù)據(jù);

????通過(guò)Context.getExternalCacheDir()方法可以獲取到 SDCard/Android/data/{package_name}/cache/,儲(chǔ)存臨時(shí)緩存數(shù)據(jù);

????這兩個(gè)目錄分別對(duì)應(yīng) 設(shè)置->應(yīng)用->應(yīng)用詳情里面的”清除數(shù)據(jù)“與”清除緩存“選項(xiàng)。


如何區(qū)分U盤(pán)和SD卡?

????????注意不要光通過(guò)路徑來(lái)區(qū)分U盤(pán)和SD卡

????? ?方法1:https://blog.csdn.net/qq_37069563/article/details/80271113(后來(lái)發(fā)現(xiàn)通過(guò)userLabel來(lái)判斷也是不準(zhǔn)確的,有的U盤(pán)不一定含有U)

????????????????? ?

????? ?方法2:

???public?class?UDiskReceiver?extends?BroadcastReceiver{
????@Override
????public?void?onReceive(Context?context,?Intent?intent)?{
????????String?action?=?intent.getAction();
????????if?(action.equals(Intent.ACTION_MEDIA_EJECT))?{
//????????????Toast.makeText(context,?"SD卡22222已經(jīng)拔出",?Toast.LENGTH_SHORT).show();
????????}?else?if?(action.equals(Intent.ACTION_MEDIA_MOUNTED))?{
????????????String?path?=?intent.getDataString().replace("/file:/",?"");
????????????File?file?=?new?File(path);
????????????getUsb(file);
//????????????Toast.makeText(context,?"SD卡2222222222已經(jīng)插入?"?+MusicScanUtil.U_PATH?,?Toast.LENGTH_SHORT).show();
????????}
????}

????private?void?getUsb(File?usb)?{
????????String?path3?=?"/mnt/media_rw/";
????????File?file?=?new?File(path3);
????????File?files[]?=?file.listFiles();
????????if(files==null)?{
????????????return;
????????}
????????for(File?f:files)?{
????????????if(TextUtils.equals(f.getName(),?usb.getName()))?{
????????????????MusicScanUtil.U_PATH?=?usb.getAbsolutePath().replace("/file:/",?"");
????????????????return;
????????????}
????????}

????}

}

????????在清單里注冊(cè)監(jiān)聽(tīng):

????<receiver?android:name=".receiver.UDiskReceiver"
????????>
????????<intent-filter?android:priority="1001"?>
????????????<action?android:name="android.intent.action.MEDIA_MOUNTED"?/>
????????????<action?android:name="android.intent.action.MEDIA_EJECT"?/>
????????????<data?android:scheme="file"?/>
????????</intent-filter>
????</receiver>

????????其實(shí)這個(gè)路徑,搞內(nèi)核的人肯定知道。無(wú)論sd卡是否存在,這個(gè)路徑都會(huì)一直存在。可以將上面u盤(pán)獲取路徑寫(xiě)死即可。對(duì)于我們的項(xiàng)目,U盤(pán)的路徑就是?"/mnt/media_rw/usb_otg",但是用多媒體相關(guān)的API

Cursor?cursor?=?getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,??muiscInfoArray,?null,?null,?null);

????????查找出來(lái)的文件的path,是以“68EE-C662”開(kāi)頭的這樣的串,也就是相當(dāng)于"/mnt/media_rw/usb_otg"一個(gè)映射路徑。就是這兩個(gè)路徑時(shí)怎么一個(gè)關(guān)系呢????

? ? ? ? 通過(guò)shell指令 "ls -l?mnt/media_rw/usb_otg",注意路徑最后沒(méi)有/,會(huì)返回包含類似"68EE-C662"這樣的串,截取出來(lái),即可根據(jù)這個(gè)路徑去過(guò)濾文件。

????????


Android保存文件到本地后連接電腦無(wú)法查看 刷新不出來(lái)的結(jié)局辦法

https://blog.csdn.net/anyixiaodi/article/details/53607123


?

Windows上TF卡格式化后,android系統(tǒng)無(wú)法識(shí)別的問(wèn)題

????????在window上格式化TF卡,會(huì)讓選格式化的格式:

? ? ? ??Android Day02-文件操作-登陸示例

????????一般android系統(tǒng)不支持exfat32格式的類型,超過(guò)32G假如電腦提示格式化,不要格式化,直接插入機(jī)器里面格式化才行,windows格式化后是無(wú)法使用的,這是windows的限制

????????

  • ? 文件夾操作

??????https://blog.csdn.net/javasxl/article/details/71524831? ?(注意重命名文件,需要新文件的父路徑與舊文件的父路徑一致)

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI