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. 通过对inflate与 findViewById 方法的探究深度了解一下Android
  3. Android sharedUserId数据权限
  4. Android的两种数据存储方式分析(二)
  5. Android轻量型数据库SQLite详解
  6. Android TCP发送16进制数据
  7. Android 屏幕旋转生命周期以及处理方法

随机推荐

  1. Thinkphp 使用原生类
  2. 如果db query A没有返回足够的结果,请运行
  3. PHP基础之脚本传参
  4. 如何解决一段时间真正的循环,因为它昂贵且
  5. PHP强大包括处理错误?
  6. Laravel将动态输入数据数组保存到数据库
  7. 在rhel5版本下安装mysql+apache+php实战
  8. 在单个测试中断言多个条件,还是分成多个测
  9. 在PHP中如何取得两个日期时间相减的结果,
  10. 函数不返回“functions.php”中的值