2.AsyncQueryHandler、内容提供者
会话页面
public class Test extends AndroidTestCase{
public void test(){
Uri uri = Uri.parse("content://sms/conversations");
String[] projection={
"sms.body AS snippet",
"sms.thread_id AS thread_id",
"groups.msg_count AS msg_count",
"address as address",
"date as date"
};
Cursor cursor = getContext().getContentResolver().query(uri, projection, null, null, " date desc");
Tools.printCursor(cursor);
}
public void testNumber(){
String number = "8888";
Uri uri = PhoneLookup.CONTENT_FILTER_URI;
Uri uri2 = Uri.withAppendedPath(uri, number);
Cursor query = getContext().getContentResolver().query(uri2, null, null, null, null);
Tools.printCursor(query);
}
public void testNumber2(){
String number = "8888";
Uri uri = PhoneLookup.CONTENT_FILTER_URI;
Uri uri2 = Uri.withAppendedPath(uri, number);
Cursor query = getContext().getContentResolver().query(uri, null, null, null, null);
Tools.printCursor(query);
}
public void getFace(){
// 根据号码查询联系人的头像:
// Step1:查询联系人的id: URI为PhoneLookup.CONTENT_FILTER_URI
// Step2:查询ContactsContract.Contacts.CONTENT_URI + 加上上面得到id, 构建好Uri之后调用ContactsContract.Contacts.openContactPhotoInputStream得到图片的流.
String number ="2222";
int id = Tools.findIDByNumber(getContext(), number);
Uri uri = Uri.withAppendedPath(Contacts.CONTENT_URI, ""+id);
InputStream input = Contacts.openContactPhotoInputStream(getContext().getContentResolver(), uri);
System.out.println(input);
}
public void findContactFromsub(){
Uri uri = Phone.CONTENT_URI;
// Uri uri = PhoneLookup.CONTENT_FILTER_URI;
Cursor cursor = getContext().getContentResolver().query(uri, null, null, null, null);
Tools.printCursor(cursor);
}
}
public class Tools {
public static void printCursor(Cursor cursor) {
if (cursor == null) {
System.out.println("cursor == null");
return;
}
if (cursor.getCount() == 0) {
System.out.println("cursor.getCount() == 0");
return;
}
while (cursor.moveToNext()) {
int columnCount = cursor.getColumnCount();
System.out.println("当前是第几行:" + cursor.getPosition());
for (int i = 0; i < columnCount; i++) {
String columnName = cursor.getColumnName(i);
String value = cursor.getString(i);
System.out.println(columnName + " : " + value);
}
}
}
/**
* 通过电话号码,查询联系人姓名
*
* @param ctx
* @param number
* 要查询的电话号码
* @return 返回联系人姓名,或者 null 表明联系人中,无此人
*/
public static String findNameByNumber(Context ctx, String number) {
String name = null;
Uri uri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, number);
Cursor cursor = ctx.getContentResolver().query(uri2,
new String[] { "display_name" }, null, null, null);
if (cursor.getCount() == 0) {
return null;
} else {
// cursor 返回时,默认指向的是 第一行的上一行,即 -1 行 ,而所有的数据是从 第 0行开始的。
cursor.moveToNext();
name = cursor.getString(0);// cursor 仅查询一列内容,所以取的时候,列的索引值为 0
}
return name;
}
/**
* 通过电话号码,查询联系人ID
*
* @param ctx
* @param number
* 要查询的电话号码
* @return 返回联系人ID,或者 -1 表明无此联系人中
*/
public static int findIDByNumber(Context ctx, String number) {
int contactId;
Uri uri2 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, number);
Cursor cursor = ctx.getContentResolver().query(uri2,
new String[] { "_id" }, null, null, null);
if (cursor.getCount() == 0) {
return -1;
} else {
// cursor 返回时,默认指向的是 第一行的上一行,即 -1 行 ,而所有的数据是从 第 0行开始的。
cursor.moveToNext();
contactId = cursor.getInt(0);// cursor 仅查询一列内容,所以取的时候,列的索引值为 0
}
return contactId;
}
/**
* 通过联系人的ID,查询联系人的头像
*
* @param ctx
* @param contactId
* @return 返回 bitmap 头像, 如果此联系人没有头像的话,返回 null
*/
public static Bitmap getFaceById(Context ctx, String contactId) {
Bitmap bitmap = null;
Uri uri = Uri.withAppendedPath(Contacts.CONTENT_URI, contactId);
InputStream input = Contacts.openContactPhotoInputStream(ctx.getContentResolver(), uri);
if(input == null){
return null;
}
bitmap = BitmapFactory.decodeStream(input);
return bitmap;
}
/**
* 根据会话ID,删除短信
* @param ctx
* @param threadId
*/
public static void deleteMsgByThreadId(Context ctx, Integer threadId) {
ctx.getContentResolver().delete(MyConstants.URI_SMS, " thread_id = ?", new String[]{""+threadId});
}
}
public class MyQueryHandler extends AsyncQueryHandler{
public MyQueryHandler(ContentResolver cr) {
super(cr);
}
@Override
/**
* 当startQuery 执行完成后,回调 此方法
* token 是startQuery 方法中的第一个参数
* cookie 是startQuery 方法中的第二个参数
* cursor 查询后的结果
*/
protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
System.out.println("onQueryComplete : token:"+token);
System.out.println("onQueryComplete : cookie:"+cookie);
Tools.printCursor(cursor);
if(cookie!=null && cookie instanceof CursorAdapter){
CursorAdapter adapter = (CursorAdapter) cookie;
// 给adapter 设置新的cursor
adapter.changeCursor(cursor);
}
if(cursorChangedListener!=null){
cursorChangedListener.onCursorChanged(token, cookie, cursor);
}
}
public IOnCursorChangedListener getCursorChangedListener() {
return cursorChangedListener;
}
public void setOnCursorChangedListener(IOnCursorChangedListener cursorChangedListener) {
this.cursorChangedListener = cursorChangedListener;
}
private IOnCursorChangedListener cursorChangedListener;
/**
* 声明,cursor改变时的监听接口
* @author Administrator
*
*/
public interface IOnCursorChangedListener{
void onCursorChanged(int token, Object cookie, Cursor cursor);
}
}
public class MyConstants {
/**
* 查询会话的URI
*/
public static Uri URI_CONVERSATION = Uri.parse("content://sms/conversations");
/**
* 直接操作SMS表
*/
public static Uri URI_SMS = Uri.parse("content://sms");
/**
* 获得所有联系人的URI
*/
public static Uri URI_CONTACTS = Phone.CONTENT_URI;
/**
* 表示短信的类型 ,1 表示是接收到的短信
*/
public static int TYPE_RECEIVE = 1;
/**
* 表示短信的类型 ,2 表示是发送的短信
*/
public static int TYPE_SEND = 2;
}
2.AsyncQueryHandler、内容提供者的更多相关文章
- Android开发学习—— ContentProvider内容提供者
* 应用的数据库是不允许其他应用访问的* 内容提供者的作用就是让别的应用访问到你的数据库.把私有数据暴露给其他应用,通常,是把私有数据库的数据暴露给其他应用. Uri:包含一个具有一定格式的字符串的对 ...
- Android学习---通过内容提供者(ContentProvider)操作另外一个应用私有数据库的内容
一.什么是ContentProvider? ContentProvider直译过来就是内容提供者,主要作用就是A应用提供接口给B应用调用数据,和之前介绍的sharedPreference和直接开放文件 ...
- Android 内容提供者的实现
接着上文<Android 内容提供者简介>进一步实现内容提供者. 每个Content Provider类都使用URI(Universal Resource Identifier,通用资源标 ...
- Android 内容提供者简介
在Android应用中,我们可以使用显式意图(Explicit Intent)来直接访问其他应用的Activity,但是这仅限于Activity的范畴:如果需要使用其他应用的数据,还需要用到另外一种组 ...
- 无废话Android之listview入门,自定义的数据适配器、采用layoutInflater打气筒创建一个view对象、常用数据适配器ArrayAdapter、SimpleAdapter、使用ContentProvider(内容提供者)共享数据、短信的备份、插入一条记录到系统短信应用(3)
1.listview入门,自定义的数据适配器 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/and ...
- 第九天 内容提供者 ContentResolver
重点:理解ContentProvider 的作用和创建流程 1. 内容提供者,提供 其他数据库的访问. 特点 - 描述 : 它是android 四大组件之一,需要androidManife ...
- Android应用开发基础之九:内容提供者(ContentProvider)
内容提供者 应用的数据库是不允许其他应用访问的 内容提供者的作用:就是让别的应用访问到你的数据库 自定义内容提供者,继承ContentProvider类,重写增删改查方法,在方法中写增删改查数据库的代 ...
- 安卓第十四天笔记-内容提供者(ContentProvider)
安卓第十四天笔记-内容提供者(ContentProvider) ContentProvider--内容提供者 1.ContentProvider简介 ContentProvider是不同应用程序之间进 ...
- Android组件系列----ContentProvider内容提供者
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- [Android Pro] 监听内容提供者ContentProvider的数据变化
转载自:http://blog.csdn.net/woshixuye/article/details/8281385 一.提出需求 有A,B,C三个应用,B中的数据需要被共享,所以B中定义了内容提供者 ...
随机推荐
- 数据结构树之AVL树(平衡二叉树)
一 什么是AVL树(平衡二叉树): AVL树本质上是一颗二叉查找树,但是它又具有以下特点:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树.在AVL树中任何节 ...
- SVN chechout 错误: xxx is not valid as filename in directory
转载:https://blog.csdn.net/ClementAD/article/details/47838989 意思就是Linux系统允许文件或文件夹的名字包含空格,而windows是不允许的 ...
- vue如何使用rules对表单字段进行校验
基于element-ui 1.在代码中,添加属性::rule <el-form :model="form" :rules="rules" ref=&quo ...
- 加密流量分析cisco
思科ETA主页 https://www.cisco.com/c/en/us/solutions/enterprise-networks/enterprise-network-security/eta. ...
- 微信小程序实战[01]
接触微信小程序也有一段时间了,以天气预报练一下手. 主要实现了以下功能: (1) 首页图标式菜单,便于以后扩展功能 (2)首页顶部滚动消息 (3)页面右上角三点菜单转发功能,便于小程序的传播 (4)天 ...
- 配置GitHub的SSH key
配置GitHub的SSH key 生成密钥对 打开git bash工具(Windows环境),Linux则直接打开命令行,执行下面的命令生成密钥文件 ssh-Keygen -t rsa -C &quo ...
- Ax2009中使用CLR发送邮件
由于Ax2009系统方法SysMailer 发送中文的时候会乱码,一直找不到原因,用.NEt Framwork的类库可以解决中文乱码的问题.static void CKT_DotNetMail(Arg ...
- faster-rcnn 笔记
2019-02-18,15点00 ''' 下面是别人写的原始的笔记,我在上面自己补充了一些. ''' #https://www.cnblogs.com/the-home-of-123/p/974796 ...
- linux简单安装方法
一.配置静态IP NAT:模式: 修改网卡eth0 vim /etc/sysconfig/network-scripts/ifcfg-eth0 内容如下: DEVICE=eth0 HWADDR=:0C ...
- flex布局嵌套之高度自适应
查遍各大资源无任何flex嵌套布局的例子,经过自己折腾完成了项目中的高度自适应需求(更多应用于前端组件) 效果图: html代码:(关键地方已经用颜色特别标识 ^_^) <!DOCTYPE ht ...