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 设置新的cursoradapter.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中定义了内容提供者 ...
随机推荐
- 十一、eclipse如何创建一个maven工程project
1. 2. 3. 4. 这是刚创建的工程,因为缺少WEB-INF/web.xml,所以项目会报错 5. 6. 再编写一个web.xml文件,项目就正常了,没有报错:后期需要自己添加对应的pom.xml ...
- MySQL数据库(增删改查语句)
MySQL数据库(增删改查语句)一.登录数据库:----> mysql -uroot -proot;(对应用户名和密码)二.SQL语句: 数据定义语言DDL 用来定义数据库.表.列,关 ...
- 执行sql语句后报1055-- this is incompatible with sql_mode=only_full_group_by
这个问题是mysql5.7中存在的问题,查看原因,在任意库执行select @@sql_mode,查到的结果为ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZER ...
- php JS 导出表格特殊处理
但是这样导出身份证号会变为科学计数: 解决方法就是: 我们了解一下excel从web页面上导出的原理.当我们把这些数据发送到客户端时,我们想让客户端程序(浏览器)以excel的格式读取 它,所以把mi ...
- 某app的安全性分析过程
交互过程如下,可以发现问题很多 http://www.ixxxx.com//api/index/app图片验证码:{"data":{"imgCode":&quo ...
- 一年web网站测试总结
1. 页面链接检查 每一个链接是否都有对应的页面,并且页面之间切换正确.可以使用一些工具,如LinkBotPro.File-AIDCS.HTML Link Validater.Xenu等工具.Link ...
- DWR使用总结
这两天学了下DWR,现在总结一下. DWR是方便使用AJAX连接JS和JAVA的的一个框架,把服务器端 Java 对象的方法公开给 JavaScript 代码. 如果是用dwr2.0的jar包,还 ...
- Scrum冲刺阶段7
成员今日完成的任务 人员 任务 何承华 美化会员查看安排界面 陈宇 后端设计 丁培辉 美化会员查看界面 温志铭 会员查看界面设计 杨宇潇 会员查看界面设计 张主强 服务器构建 成员遇到的问题 人员 问 ...
- 第三周助教工作总结——NWNU李泓毅
本周点评作业数量:第一部分是第一篇博客的剩余部分,给出了共计22份作业的具体分数.第二部分是第二篇博客的已提交部分共计19份作业. 这是我的博客地址:https://www.cnblogs.com/N ...
- JAVA主流日志梳理
JAVA主流日志梳理 引入 历史故事 Log4j - JDK1.3及以前 JUL - JDK1.4 JCL - 日志门面commons-logging的出现 SLF4j - 可能是最好的日志框架 lo ...