android中读写文件的需求地方很多,其中就包括了识别U盘,弹出U盘,读写U盘的文件等。


那么,如何实现这些需求呢?笔者简单的说下:


1.识别U盘:

识别U盘的方法只要是用到了2个android官方类。

它们分别为:ContentResolver和AsyncQueryHandler。表现为前者提供内容给后者读取。

作法如下:

1)获取状态并遍历

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)回调数据给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盘挂载或者拔出时都会调用一次,在这期间会调用这个方法,因为我们可以在这回调用执行线程达到遍历数据的目的,从而数据到U盘和文件的个数,其次是QueryArg是一个自定义类,用于封装我们所需要的数据,以便区分。下面也贴一下这个类

    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盘的方法很简单,跟删除数据库数据基本类似。

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盘状态,对系统无影响。主要原因在于update时提供的Uri仅影响当前包名的内容提供者。

要对自身软件在弹出状态下不重新插拔的前提下,实现重加载笔者暂时没看到有相关方法,若有请告知,谢。


3.读写U盘文件

在前面1中有识别U盘的方法,其中在遍历的时候可以自定义一个回调。

QueryNotify(Uri uri, Cursor cursor)
当然参数的个数或者回调的名字可以自定义,笔者在这里有2个参数,第一个主要用于区分类型,第二个作用在于获取数据。

在这里已经有cursor,因此也不是什么难事了,在这里也不bb如何读数据了。

简单的说下如何写数据。

写数据的方法跟弹出U盘大似相同,都是通过

ContentResolver 
ContentValues 

 这2个类来实现。   

mContext.getContentResolver().update(                                        MediaStore.getContentUri(MediaStore.MediaBase.TABLE_NAME, info.id), values,                                        "_id=", new String[] { info.id + "" });
如此,就达到了实现更改文件属性的需求了。


如此,大致上就可以完成大致上关于U盘读写识别相关的需求,当然此文也是浅尝辄止,许许多多的细节都要自己去尝试并完善。

感觉你的浏览,若有问题可以留言。






更多相关文章

  1. Android高手进阶教程(十一)之----Android(安卓)通用获取Ip的方法
  2. android ContentResolver和ContentProvider的使用
  3. Android(安卓)中LayoutInflater(布局加载器)之实战篇
  4. Android应用AsyncTask处理机制详解及源码分析
  5. QtAndroid详解(2):startActivity和它的小伙伴们
  6. 浅谈Java中Collections.sort对List排序的两种方法
  7. mybatisplus的坑 insert标签insert into select无参数问题的解决
  8. python起点网月票榜字体反爬案例
  9. Python list sort方法的具体使用

随机推荐

  1. 函数参数与返回值,模板字面量与模板函数
  2. 基于PHP实现生成随机水印图片
  3. jsp form表单方法示例
  4. PHP sdk实现在线打包代码示例
  5. JSP request(return String)用法详例
  6. PHP sdk文档处理常用代码示例解析
  7. 插画用PS怎么画?ps画插画的步骤
  8. JSP request(return String)用法详例
  9. PHP如何解决微信文章图片防盗链
  10. JSP request(return String)用法详例