android中讀寫文件的需求地方很多,其中就包括了識別U盤,彈出U盤,讀寫U盤的文件等。
創(chuàng)新互聯(lián)公司堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計制作、網(wǎng)站設(shè)計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的晉源網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
那么,如何實現(xiàn)這些需求呢?筆者簡單的說下:
1.識別U盤:
識別U盤的方法只要是用到了2個android官方類。
它們分別為:ContentResolver和AsyncQueryHandler。表現(xiàn)為前者提供內(nèi)容給后者讀取。
作法如下:
1)獲取狀態(tài)并遍歷
contentObserver = new ContentObserver(mHandler) { @Override public void onChange(boolean selfChange, Uri uri) { super.onChange(selfChange, uri); mHandler.removeCallbacks(arg.runnable); mHandler.postDelayed(arg.runnable, DELAY); } };
runnable = new Runnable() { @Override public void run() { mAsyncQueryHandler.startQuery(token, null, uri, projection, selection, selectionArgs, orderBy); } };
2)回調(diào)數(shù)據(jù)給UI
mAsyncQueryHandler = new AsyncQueryHandler(mCR) { @Override protected void onQueryComplete(int token, Object cookie, Cursor cursor) { super.onQueryComplete(token, cookie, cursor); if (!mArgs.isEmpty() && token < mArgs.size()) { QueryArg arg = mArgs.get(token); if (mCallback != null) { mCallback.QueryNotify(arg.uri, cursor); } if (!cursor.isClosed()) { cursor.close(); } } } };
簡單的說下,onchanged是在U盤掛載或者拔出時都會調(diào)用一次,在這期間會調(diào)用這個方法,因為我們可以在這回調(diào)用執(zhí)行線程達到遍歷數(shù)據(jù)的目的,從而數(shù)據(jù)到U盤和文件的個數(shù),其次是QueryArg是一個自定義類,用于封裝我們所需要的數(shù)據(jù),以便區(qū)分。下面也貼一下這個類
protected static final class QueryArg { public Uri uri; public String[] projection; public String selection; public String[] selectionArgs; public String orderBy; public ContentObserver contentObserver; public Runnable runnable; public Object cookie; }
2.安全彈出U盤
彈出U盤的方法很簡單,跟刪除數(shù)據(jù)庫數(shù)據(jù)基本類似。
1)
ContentResolver cr = mContext.getContentResolver();
2)
ContentValues values = new ContentValues(); values.put(MediaStore.MediaDevice.FIELD_VALID, false); cr.update(MediaStore.MediaDevice.CONTENT_URI, values, where, selectionArgs);
如此就可彈出U盤。注意:在自己軟件中彈出U盤僅改變此軟件的U盤狀態(tài),對系統(tǒng)無影響。主要原因在于update時提供的Uri僅影響當(dāng)前包名的內(nèi)容提供者。
要對自身軟件在彈出狀態(tài)下不重新插拔的前提下,實現(xiàn)重加載筆者暫時沒看到有相關(guān)方法,若有請告知,謝。
3.讀寫U盤文件
在前面1中有識別U盤的方法,其中在遍歷的時候可以自定義一個回調(diào)。
QueryNotify(Uri uri, Cursor cursor)
當(dāng)然參數(shù)的個數(shù)或者回調(diào)的名字可以自定義,筆者在這里有2個參數(shù),第一個主要用于區(qū)分類型,第二個作用在于獲取數(shù)據(jù)。
在這里已經(jīng)有cursor,因此也不是什么難事了,在這里也不bb如何讀數(shù)據(jù)了。
簡單的說下如何寫數(shù)據(jù)。
寫數(shù)據(jù)的方法跟彈出U盤大似相同,都是通過
ContentResolverContentValues
這2個類來實現(xiàn)。
mContext.getContentResolver().update( MediaStore.getContentUri(MediaStore.MediaBase.TABLE_NAME, info.id), values, "_id=", new String[] { info.id + "" });
如此,就達到了實現(xiàn)更改文件屬性的需求了。
如此,大致上就可以完成大致上關(guān)于U盤讀寫識別相關(guān)的需求,當(dāng)然此文也是淺嘗輒止,許許多多的細節(jié)都要自己去嘗試并完善。
以上這篇android 識別U盤以及讀寫文件的方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持創(chuàng)新互聯(lián)。