您好,登錄后才能下訂單哦!
需求:登陸
第1步:搭建UI
????采用混合布局,布局搭建好之后如下所示:
????
第2步:準(zhǔn)備工作
????根據(jù)javaWeb中的mvc+dao的開(kāi)發(fā)模式,創(chuàng)建好包名和類。
????
第3步:業(yè)務(wù)邏輯
????就是一個(gè)存值和取值的過(guò)程,也可以說(shuō)是讀寫(xiě)文件的過(guò)程。
????注意在獲取路徑的時(shí)候,不要使用硬性編碼(hardcode)。
關(guān)鍵知識(shí)點(diǎn)梳理:
????
????▇獲取應(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)限。
????????????
????????→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ǔ)的信息:
????????
?????▇獲取資產(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ò)濾文件。
????????
https://blog.csdn.net/anyixiaodi/article/details/53607123
?
????????在window上格式化TF卡,會(huì)讓選格式化的格式:
? ? ? ??
????????一般android系統(tǒng)不支持exfat32格式的類型,超過(guò)32G假如電腦提示格式化,不要格式化,直接插入機(jī)器里面格式化才行,windows格式化后是無(wú)法使用的,這是windows的限制
????????
? 文件夾操作
??????https://blog.csdn.net/javasxl/article/details/71524831? ?(注意重命名文件,需要新文件的父路徑與舊文件的父路徑一致)
免責(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)容。