Android利用ContentProvider获取本地数据的方法

所属分类: 软件编程 / Android 阅读数: 63
收藏 0 赞 0 分享

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

  1. 本地多媒体(图片、音视频等)
  2. 通讯录联系人
  3. 通话记录
  4. 短信记录
  5. ...

当然,这些数据必须通过用户授权后才可以调用,所以在调用前请申请对应的权限(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)

其中参数的含义

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

  1. projection 查询结果需要哪一些属性,null的时候返回所有
  2. selection 查询条件
  3. selectionArgs 对应查询条件的参数
  4. sortOrder 排列条件

以图片为例子

如果你不知道有哪些字段,可以通过<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,我们既可以获取本地的图片,实现我们自定义的选图功能,可以获取通讯录,实现自定义的联系人界面,也可以获取短信记录,完成对应的页面功能效果。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

Android网络编程之获取网络上的Json数据实例

这篇文章主要介绍了Android网络编程之获取网络上的Json数据实例,本文用完整的代码实例讲解了在Android中读取网络中Json数据的方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中的windowSoftInputMode属性详解

这篇文章主要介绍了Android中的windowSoftInputMode属性详解,本文对windowSoftInputMode的9个属性做了详细总结,需要的朋友可以参考下
收藏 0 赞 0 分享

Android网络编程之UDP通信模型实例

这篇文章主要介绍了Android网络编程之UDP通信模型实例,本文给出了服务端代码和客户端代码,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中使用ListView实现漂亮的表格效果

这篇文章主要介绍了Android中使用ListView实现漂亮的表格效果,本文用详细的代码实例创建了一个股票行情表格,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中刷新界面的二种方法

这篇文章主要介绍了Android中刷新界面的二种方法,本文使用Handler、postInvalidate两种方法实现界面刷新,需要的朋友可以参考下
收藏 0 赞 0 分享

Android SDK三种更新失败及其解决方法

这篇文章主要介绍了Android SDK三种更新失败及其解决方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(一)

Android3.0(API level 11)开始,Android设备不再需要专门的菜单键。随着这种变化,Android app应该取消对传统6项菜单的依赖。取而代之的是提供anction bar来提供基本的用户功能
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(二)

这次将继续上一篇文章没有讲完的Menu的学习,上下文菜单(Context menu)和弹出菜单(Popup menu)
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(三)

今天继续昨天没有讲完的Menu的学习,主要是Popup Menu的学习,需要的朋友可以参考下
收藏 0 赞 0 分享

Android显示网络图片实例

这篇文章主要介绍了Android显示网络图片的方法,以实例形式展示了Android程序显示网络图片的方法,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多