android 识别U盘以及读写文件的方法
android中读写文件的需求地方很多,其中就包括了识别U盘,弹出U盘,读写U盘的文件等。
那么,如何实现这些需求呢?笔者简单的说下:
1.识别U盘:
识别U盘的方法只要是用到了2个android官方类。
它们分别为:ContentResolver和AsyncQueryHandler。表现为前者提供内容给后者读取。
作法如下:
1)获取状态并遍历
contentObserver=newContentObserver(mHandler){ @Override publicvoidonChange(booleanselfChange,Uriuri){ super.onChange(selfChange,uri); mHandler.removeCallbacks(arg.runnable); mHandler.postDelayed(arg.runnable,DELAY); } };
runnable=newRunnable(){ @Override publicvoidrun(){ mAsyncQueryHandler.startQuery(token,null,uri,projection,selection,selectionArgs, orderBy); } };
2)回调数据给UI
mAsyncQueryHandler=newAsyncQueryHandler(mCR){ @Override protectedvoidonQueryComplete(inttoken,Objectcookie,Cursorcursor){ super.onQueryComplete(token,cookie,cursor); if(!mArgs.isEmpty()&&token简单的说下,onchanged是在U盘挂载或者拔出时都会调用一次,在这期间会调用这个方法,因为我们可以在这回调用执行线程达到遍历数据的目的,从而数据到U盘和文件的个数,其次是QueryArg是一个自定义类,用于封装我们所需要的数据,以便区分。下面也贴一下这个类
protectedstaticfinalclassQueryArg{ publicUriuri; publicString[]projection; publicStringselection; publicString[]selectionArgs; publicStringorderBy; publicContentObservercontentObserver; publicRunnablerunnable; publicObjectcookie; }2.安全弹出U盘
弹出U盘的方法很简单,跟删除数据库数据基本类似。
1)
ContentResolvercr=mContext.getContentResolver();2)
ContentValuesvalues=newContentValues(); values.put(MediaStore.MediaDevice.FIELD_VALID,false); cr.update(MediaStore.MediaDevice.CONTENT_URI,values,where,selectionArgs);如此就可弹出U盘。注意:在自己软件中弹出U盘仅改变此软件的U盘状态,对系统无影响。主要原因在于update时提供的Uri仅影响当前包名的内容提供者。
要对自身软件在弹出状态下不重新插拔的前提下,实现重加载笔者暂时没看到有相关方法,若有请告知,谢。
3.读写U盘文件
在前面1中有识别U盘的方法,其中在遍历的时候可以自定义一个回调。
QueryNotify(Uriuri,Cursorcursor)当然参数的个数或者回调的名字可以自定义,笔者在这里有2个参数,第一个主要用于区分类型,第二个作用在于获取数据。
在这里已经有cursor,因此也不是什么难事了,在这里也不bb如何读数据了。
简单的说下如何写数据。
写数据的方法跟弹出U盘大似相同,都是通过
ContentResolverContentValues 这2个类来实现。
mContext.getContentResolver().update( MediaStore.getContentUri(MediaStore.MediaBase.TABLE_NAME,info.id),values, "_id=",newString[]{info.id+""});如此,就达到了实现更改文件属性的需求了。
如此,大致上就可以完成大致上关于U盘读写识别相关的需求,当然此文也是浅尝辄止,许许多多的细节都要自己去尝试并完善。
以上这篇android识别U盘以及读写文件的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。