Android开发Android开发经验谈

利用ContentProvider获取本地数据

2018-04-23  本文已影响62人  Arestory

上一篇,我们讲到ContentProvider的主要功能是,提供共享数据给其他应用使用。在Android系统内部,同样提供了共享数据,查看 android.provider包下,发现有以下的共享数据

当然,这些数据必须通过用户授权后才可以调用,所以在调用前请申请对应的权限(6.0系统以上)

requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},1000);

获取数据

getContentResolver()的查询方法

query(@RequiresPermission.Read @NonNull Uri uri,
        @Nullable String[] projection, @Nullable String selection,
        @Nullable String[] selectionArgs, @Nullable String sortOrder)

其中参数的含义

图片为MediaStore.Images.Media.EXTERNAL_CONTENT_URI(外部)以及MediaStore.Images.Media.INTERNAL_CONTENT_URI(内部)
视频为MediaStore.Video.Media.EXTERNAL_CONTENT_URI
音频为MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
通讯录ContactsContract.Contacts.CONTENT_URI
通话记录CallLog.Calls.CONTENT_URI
短信记录Telephony.Sms.CONTENT_URI

以图片为例子

如果你不知道有哪些字段,可以通过<code>MediaStore.Images.ImageColumns</code>查到所有字段,你也可以通过以下方式获取所有的字段

String [] columnNames = mCursor.getColumnNames();

正确姿势


//图片类型的Uri路径
final Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
//按照图片修改时间,筛选出jpeg和png类型的图片
Cursor mCursor =mContext.getContentResolver()
    .query(uri,null,MediaStore.Images.ImageColumns.MIME_TYPE + "=? or "+ MediaStore.Images.ImageColumns.MIME_TYPE + "=?",
    new String[]{"image/jpeg", "image/png"}, MediaStore.Images.Media.DATE_MODIFIED); 
if(mCursor!=null){

while(mCursor.moveToNext()){

//获取图片路径
String path = mCursor.getString(mCursor
        .getColumnIndex(MediaStore.Images.ImageColumns.DATA));
//获取修改日期
long date = mCursor.getLong(mCursor
        .getColumnIndex(MediaStore.Images.ImageColumns.DATE_MODIFIED));

//do something
}
}

由于数据量可能会很大,建议将查询等操作放到子线程进行,避免阻塞主线程

利用ContentProvider,我们既可以获取本地的图片,实现我们自定义的选图功能,可以获取通讯录,实现自定义的联系人界面,也可以获取短信记录,完成对应的页面功能效果。

上一篇 下一篇

猜你喜欢

热点阅读