您好,登錄后才能下訂單哦!
需求:登陸
第1步:搭建UI
????采用混合布局,布局搭建好之后如下所示:
????
第2步:準備工作
????根據javaWeb中的mvc+dao的開發模式,創建好包名和類。
????
第3步:業務邏輯
????就是一個存值和取值的過程,也可以說是讀寫文件的過程。
????注意在獲取路徑的時候,不要使用硬性編碼(hardcode)。
關鍵知識點梳理:
????
????▇獲取應用程序的files私有目錄:"/data/data/應用程序包名/files"
? ? ? ? ?方式1:得路徑,再得到流。
????????????File?context.getFilesDir()
? ? ?<-- ?補充一下 File?context.getCacheDir()????表示得到緩存目錄/caches-->
????? ? 方式2:直接得到流
? ? ? ? ? ?文件讀取流:InputStream in = context.openFileInput("文件名(帶后綴)");? ? ????
? ? ? ? ? ?文件寫入流:OutputStream out ?= context.openFileOutput("user.txt", ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Context.MODE_PRIVATE);//有2個參數,第2個參數
????????????????????????表示文件的權限。
????????
? ? ? ? ? ??
????▇獲取設備的SD卡目錄:
????????→1.注意要配置sd的訪問權限。
????????????
????????→2.判斷sd卡的狀態。????
????????????
String?storageState?=?Environment.getExternalStorageState(); if(!storageState.equals(Environment.MEDIA_MOUNTED)) { ????//如果掛起,提示用戶sd卡不存在。 Toast.makeText(mainContext,?"sd卡不存在",?Toast.LENGTH_SHORT).show(); return; }
????????→3.判斷sd卡空間容量信息。
????????
//假如SD卡小于200M就提示內存不足 //首先獲取外部存儲的目錄?File對象 File?file_storage?=?Environment.getExternalStorageDirectory(); //通過File對象來獲得外部存儲的可用空間 Long?useable_storage?=?file_storage.getUsableSpace(); //將字節轉換成易于閱讀的M表示方法 ????????String?useable_storage_mstr?=?Formatter.formatFileSize(mainContext,useable_storage); ???????? //得到外部存儲的總空間 Long?total_storage?=?file_storage.getTotalSpace(); String?total_storage_mstr?=?Formatter.formatFileSize(mainContext,?total_storage); ????????if(useable_storage?<?1024*1024*200) { Toast.makeText(mainContext,?"外部存儲空間不足,剩余可用空間為:" ???????? +?useable_storage_mstr?+"M"?? ???????? +?",總空間為:"?+?total_storage_mstr?+?"M" ???????? ,?Toast.LENGTH_LONG).show(); return; }
????????通過linux命令df /sdcard來獲得外部設備外部存儲的信息:
????????
?????▇獲取資產文件夾Asset目錄下的文件輸入流:
????????
//獲取上下文的所有資源對象 Resources?res?=?context.getResources(); //從資源對象中獲取資產目錄Asset的管理器AssetManager AssetManager?manager?=?res.getAssets(); //利用管理器的open方法獲取它的目錄下指定文件的讀取流 InputStream?in?=?manager.open("user.txt");
????????
????????另外一種實現方式:
mContext.getAssets().open("sdk.properties")
????????
?▇Preferences:"/data/data/應用程序包名/shared_prefs"
????? ?用于存放一些簡單的標記信息、設置信息。通過xml文件在實現保存和取出。
??????PreferenceManager.getDefaultSharedPreferences 此方法獲取的xml為“應用程序包名_preferences.xml"文件。
??????
????? ? ?
???? ? Preferences存儲文件流程
//第1步:通過上下文對象得到SharedPreferences對象 ????????SharedPreferences?user_pref?=??context.getSharedPreferences("user.txt",?Context.MODE_PRIVATE); //第2步:得到SharedPreferences的Editor對象 Editor?user_editor?=?user_pref.edit(); //第3步:通過Editor向SharedPreferences對象里面設置值,類似map中的鍵和值?。 user_editor.putString("username",?user.getUsername());? user_editor.putString("password",?user.getPassword()); //第4步:提交Editor return?user_editor.commit();
??????Preferences讀取文件內容
//第1步:通過上下文對象得到SharedPreferences對象 ????????SharedPreferences?user_share?=?context.getSharedPreferences("user.txt",?Context.MODE_PRIVATE); //第2步:得到share對象的數據 String?username?=?user_share.getString("username",?"用戶名找不到"); String?password?=?user_share.getString("password",?"密碼找不到");? //上面getString方法的第二個參數為找不到指定鍵名的時候返回的缺省值。
????
????通過總結可以發現,上面的這些文件讀取流,都只能讀取當前應用程序的私有目錄下的文件流,有局限性。如果要想跨應用讀取數據,還是得結合一般IO流。
????今天還講了XML的解析和序列化,和javaWeb中的xml的解析及序列化十分的相似,只是獲取解析器和序列器的方式稍有不同,是通過Xml這個類直接獲取的。
? ? ▇讀取properties文件亂碼:
??????properties里是不能直接寫中文的,中文需要轉碼成unicode編碼,也就是以\u開頭的。
?
Excel導出? ? ? ?
????????????https://blog.csdn.net/kangweijian/article/details/86694670 ?
Android 開發時如何正確獲取使用擴展存儲路徑
????http://http://my.oschina.net/liucundong/blog/314520
????
????作為一個程序員,想必你也很討厭App在SD卡根目錄亂建目錄吧,那就從我做起,來遵守Google的這一規定吧。
????通過Context.getExternalFilesDir()方法可以獲取到 SDCard/Android/data/{package_name}/files/ ,儲存一些長時間保存的數據;
????通過Context.getExternalCacheDir()方法可以獲取到 SDCard/Android/data/{package_name}/cache/,儲存臨時緩存數據;
????這兩個目錄分別對應 設置->應用->應用詳情里面的”清除數據“與”清除緩存“選項。
如何區分U盤和SD卡?
????????注意不要光通過路徑來區分U盤和SD卡
????? ?方法1:https://blog.csdn.net/qq_37069563/article/details/80271113(后來發現通過userLabel來判斷也是不準確的,有的U盤不一定含有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已經拔出",?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已經插入?"?+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; ????????????} ????????} ????} }
????????在清單里注冊監聽:
????<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>
????????其實這個路徑,搞內核的人肯定知道。無論sd卡是否存在,這個路徑都會一直存在。可以將上面u盤獲取路徑寫死即可。對于我們的項目,U盤的路徑就是?"/mnt/media_rw/usb_otg",但是用多媒體相關的API
Cursor?cursor?=?getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,??muiscInfoArray,?null,?null,?null);
????????查找出來的文件的path,是以“68EE-C662”開頭的這樣的串,也就是相當于"/mnt/media_rw/usb_otg"一個映射路徑。就是這兩個路徑時怎么一個關系呢????
? ? ? ? 通過shell指令 "ls -l?mnt/media_rw/usb_otg",注意路徑最后沒有/,會返回包含類似"68EE-C662"這樣的串,截取出來,即可根據這個路徑去過濾文件。
????????
https://blog.csdn.net/anyixiaodi/article/details/53607123
?
????????在window上格式化TF卡,會讓選格式化的格式:
? ? ? ??
????????一般android系統不支持exfat32格式的類型,超過32G假如電腦提示格式化,不要格式化,直接插入機器里面格式化才行,windows格式化后是無法使用的,這是windows的限制
????????
? 文件夾操作
??????https://blog.csdn.net/javasxl/article/details/71524831? ?(注意重命名文件,需要新文件的父路徑與舊文件的父路徑一致)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。