Android利用ContentProvider获取本地数据的方法
上一篇,我们讲到ContentProvider的主要功能是,提供共享数据给其他应用使用。在Android系统内部,同样提供了共享数据,查看android.provider包下,发现有以下的共享数据
- 本地多媒体(图片、音视频等)
- 通讯录联系人
- 通话记录
- 短信记录
- ...
当然,这些数据必须通过用户授权后才可以调用,所以在调用前请申请对应的权限(6.0系统以上)
requestPermissions(newString[]{Manifest.permission.READ_EXTERNAL_STORAGE},1000);
获取数据
getContentResolver()的查询方法
query(@RequiresPermission.Read@NonNullUriuri, @NullableString[]projection,@NullableStringselection, @NullableString[]selectionArgs,@NullableStringsortOrder)
其中参数的含义
uri目标的uri路径
图片为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
- projection查询结果需要哪一些属性,null的时候返回所有
- selection查询条件
- selectionArgs对应查询条件的参数
- sortOrder排列条件
以图片为例子
如果你不知道有哪些字段,可以通过MediaStore.Images.ImageColumns
查到所有字段,你也可以通过以下方式获取所有的字段
String[]columnNames=mCursor.getColumnNames();
正确姿势
//图片类型的Uri路径 finalUriuri=MediaStore.Images.Media.EXTERNAL_CONTENT_URI; //按照图片修改时间,筛选出jpeg和png类型的图片 CursormCursor=mContext.getContentResolver() .query(uri,null,MediaStore.Images.ImageColumns.MIME_TYPE+"=?or"+MediaStore.Images.ImageColumns.MIME_TYPE+"=?", newString[]{"image/jpeg","image/png"},MediaStore.Images.Media.DATE_MODIFIED); if(mCursor!=null){ while(mCursor.moveToNext()){ //获取图片路径 Stringpath=mCursor.getString(mCursor .getColumnIndex(MediaStore.Images.ImageColumns.DATA)); //获取修改日期 longdate=mCursor.getLong(mCursor .getColumnIndex(MediaStore.Images.ImageColumns.DATE_MODIFIED)); //dosomething } }
由于数据量可能会很大,建议将查询等操作放到子线程进行,避免阻塞主线程
利用ContentProvider,我们既可以获取本地的图片,实现我们自定义的选图功能,可以获取通讯录,实现自定义的联系人界面,也可以获取短信记录,完成对应的页面功能效果。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。