ContentResolver / getContentResolver()
 
外界的程序通过ContentResolver接口可以访问ContentProvider提供的数据,在Activity当中通过getContentResolver()可以得到当前应用的 ContentResolver实例。ContentResolver提供的接口和ContentProvider中需要实现的接口对应,具体可以查看API Doc,不过可以发现ContentResolver里面的方法很多都是final或者static的。在实际应用中,我们很少实现ContentResolver抽象类,更多时候通过getContentResolver()从一个Activity或其它应用程序组件的实现里获取一个ContentResolver:

短信的uri地址:"content:\\sms\"

 public class MainActivity extends Activity {

     @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); } /*
* 备份短信点击事件*/
public void backupSms(View v){
//1.查出所有短信
Uri uri = Uri.parse("content://sms/");
//通过上下对象的getContentRolver方法获得ContentResolver实例
ContentResolver resolver = getContentResolver();
//获得游标Cursor对象
Cursor cor= resolver.query(uri, new String[]{"_id","address","date","type","body"}, null, null, null);
if(cor!=null&&cor.getCount()>0){
List<SmsInfo> list=new ArrayList<SmsInfo>();
SmsInfo sms;
while(cor.moveToNext()){
sms=new SmsInfo();
sms.setsId(cor.getInt(0));
sms.setAddress(cor.getString(1));
sms.setDate(cor.getLong(2));
sms.setType(cor.getInt(3));
sms.setBody(cor.getString(4));
list.add(sms);
}
cor.close();
Log.w("MainActivity", "list中条数:"+String.valueOf(list.size()));
//2.存到本地
writeToLocal(list);
} } private void writeToLocal(List<SmsInfo> smslist){ try {
XmlSerializer srlz= Xml.newSerializer();//得到序列化对象
/*动态获取sd卡地址
* String state=Environment.getExternalStorageState();
if(Environment.MEDIA_MOUNTED.equals(state)){
return;
}
File sdcardFile=Environment.getExternalStorageDirectory();
File f=new File(sdcardFile,"sms.xml");*/
FileOutputStream fos=new FileOutputStream("/mnt/sdcard/sms.xml");
//将数据写入xml文本
srlz.setOutput(fos, "utf-8"); srlz.startDocument("utf-8", true); srlz.startTag(null, "SmsInfo");
for (SmsInfo s : smslist) {
srlz.startTag(null, "sms");
srlz.attribute(null, "id", String.valueOf(s.getsId())); srlz.startTag(null, "address");
srlz.text(s.getAddress());
srlz.endTag(null, "address"); srlz.startTag(null, "date");
srlz.text(String.valueOf(s.getDate()));
srlz.endTag(null, "date"); srlz.startTag(null, "type");
srlz.text(String.valueOf(s.getType()));
srlz.endTag(null, "type"); srlz.startTag(null, "body");
srlz.text(s.getBody());
srlz.endTag(null, "body"); srlz.endTag(null, "sms");
} srlz.endTag(null, "SmsInfo"); srlz.endDocument(); Toast.makeText(this, "保存成功", 0).show(); } catch (Exception e) {
Toast.makeText(this, "保存失败", 0).show();
e.printStackTrace(); }
}
}

备份短信实例

添加外部读写权限与本地读取权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

<uses-permission android:name="android.permission.READ_SMS"/>

联系人的uri地址:

content://com.android.contacts/raw_contacts
content://com.android.contacts/data

 public class MainActivity extends Activity {

     private static final String TAG = "MainActivity";

     @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} private void printCursor(Cursor cursor) {
if(cursor != null && cursor.getCount() > 0) { while(cursor.moveToNext()) { int columnCount = cursor.getColumnCount(); // 列的总数 for (int i = 0; i < columnCount; i++) {
String columnName = cursor.getColumnName(i); // 取对应i位置的列的名称
String columnValue = cursor.getString(i); // 取出对应i位置的列的值 Log.i(TAG, "当前是第" + cursor.getPosition() + "行: " + columnName + " = " + columnValue);
}
}
cursor.close();
}
} /**
* 查询联系人
* @param v
*/
public void queryContacts(View v) {
// 1. 去raw_contacts表中取所有联系人的_id
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
Uri dataUri = Uri.parse("content://com.android.contacts/data"); Cursor cursor = getContentResolver().query(uri, new String[]{"_id"}, null, null, null);
// printCursor(cursor);
if(cursor != null && cursor.getCount() > 0) { while(cursor.moveToNext()) {
int id = cursor.getInt(0);
// 2. 去data表中根据上面取到的_id查询对应id的数据. //where语句
String selection = "raw_contact_id = ?";
//where语句需要的值
String[] selectionArgs = {String.valueOf(id)};
// 需要的字段
Cursor c = getContentResolver().query(dataUri, new String[]{"data1", "mimetype"},
selection, selectionArgs, null);
if(c != null && c.getCount() > 0) { while(c.moveToNext()) {
String mimetype = c.getString(1); // 当前取的是mimetype的值
String data1 = c.getString(0); // 当前取的是data1数据 if("vnd.android.cursor.item/phone_v2".equals(mimetype)) {
Log.i(TAG, "号码: " + data1);
} else if("vnd.android.cursor.item/name".equals(mimetype)) {
Log.i(TAG, "姓名: " + data1);
} else if("vnd.android.cursor.item/email_v2".equals(mimetype)) {
Log.i(TAG, "邮箱: " + data1);
}
}
c.close();
}
}
cursor.close();
} } public void addContacts(View v) {
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
Uri dataUri = Uri.parse("content://com.android.contacts/data");
// 1. 在raw_contacts表中添加一个记录 // 取raw_contacts表中contact_id的值
Cursor cursor = getContentResolver().query(uri, new String[]{"contact_id"}, null, null, "contact_id desc limit 1");
if(cursor != null && cursor.moveToFirst()) {
int contact_id = cursor.getInt(0);
contact_id ++;
cursor.close(); ContentValues values = new ContentValues();
values.put("contact_id", contact_id);
getContentResolver().insert(uri, values); // 2. 根据上面添加记录的id, 取data表中添加三条数据 // 存号码
values = new ContentValues();
values.put("mimetype", "vnd.android.cursor.item/phone_v2");
values.put("data1", "10086");
values.put("raw_contact_id", contact_id);
getContentResolver().insert(dataUri, values); // 存姓名
values = new ContentValues();
values.put("mimetype", "vnd.android.cursor.item/name");
values.put("data1", "中国移动");
values.put("raw_contact_id", contact_id);
getContentResolver().insert(dataUri, values); // 存姓名
values = new ContentValues();
values.put("mimetype", "vnd.android.cursor.item/email_v2");
values.put("data1", "10086@kengni.com");
values.put("raw_contact_id", contact_id);
getContentResolver().insert(dataUri, values);
} }
}

获取联系人

添加联系人的读写sd卡权限

<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>

ContentObServer应用:

1 首先创建一个ContentObserver的子类,然后实现里面的onChange方法,监听的Uri中的数据发生变化的时候,会调用onchange方法。

2 注册ContentObserver。

 public class MainActivity extends Activity {

     @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // 监听系统短信 ContentResolver resolver = getContentResolver(); // 注册一个内容观察者观察短信数据库
resolver.registerContentObserver(Uri.parse("content://sms/"), true, new MyContentObserver(new Handler()));
} /**
* 内容观察者
*/
class MyContentObserver extends ContentObserver { private static final String TAG = "MyContentObserver"; public MyContentObserver(Handler handler) {
super(handler);
} /**
* 当被监听的内容发生改变时回调
*/
@Override
public void onChange(boolean selfChange) {
Log.i(TAG, "短信改变了");
Uri uri = Uri.parse("content://sms/outbox"); // 发件箱的uri // 查询发件箱的内容
Cursor cursor = getContentResolver().query(uri, new String[]{"address", "date", "body"}, null, null, null);
if(cursor != null && cursor.getCount() > 0) { String address;
long date;
String body;
while(cursor.moveToNext()) {
address = cursor.getString(0);
date = cursor.getLong(1);
body = cursor.getString(2); Log.i(TAG, "号码: " + address + ", 日期: " + date + ", 内容: " + body);
}
cursor.close();
}
}
}
}

基础学习总结(六)--getContentRolver()的应用、内容监听者ContentObserver的更多相关文章

  1. salesforce 零基础学习(六十八)http callout test class写法

    此篇可以参考: https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_restfu ...

  2. salesforce 零基础学习(六十九)当新增/修改一条记录以后发生了什么(适合初学者)

    salesforce开发中,我们会对object进行很多的操作,比如对object设置字段的必填性唯一性等,设置validation rule实现一下相关的字段的逻辑校验,设置workflow实现某个 ...

  3. Java基础学习(六)-- 递归以及文件I/O流基础详解

    递归 1.递归的概念: 在函数自身内部,调用函数本身的方式,称为递归. 2.递归的注意事项:包括递进去,归出来两步.   即:首先依次执行[函数调自身语句]上半部分的代码,知道最里层.(递进去),然后 ...

  4. salesforce 零基础学习(六十)Wizard样式创建数据

    项目中表之间关联关系特别多,比如三个表中A,B,C  C作为主表,A,B作为从表,有时候C表需要创建数据时,同时需要创建A,B两个表的数据,这种情况下,使用Wizard样式会更加友好. 以Goods_ ...

  5. 【JavaScript基础学习】关于正则表达式的完整内容

    w3cJavaScript RegExp对象  这个如果第一次看的话应该会很莫名其妙,但可以看一遍留个印象. 正则表达式30分钟入门教程 这个教程非常完整,走一遍大概能够明白怎么回事了. 正则表达式在 ...

  6. javascript基础学习(六)

    javascript之对象 学习要点: 对象的属性和方法 对象的原型 一.对象 对象其实就是一种引用类型,而对象的值就是引用对象的实例. 二.创建对象 在javascript中有两种对象,一种是系统内 ...

  7. salesforce 零基础学习(六十五)VF页面应善于使用变量和函数(一)常用变量的使用

    我们在使用formula或者validation rules等的时候通常会接触到很多function,这些函数很便捷的解决了我们很多问题.其实很多函数也可以应用在VF页面中,VF页面有时候应该善于使用 ...

  8. salesforce 零基础学习(六十六)VF页面应善于使用变量和函数(二)常用函数的使用

    上一篇介绍VF中常用的变量,此篇主要内容为VF页面可以直接使用的函数,主要包括Date相关函数,Text相关函数,Information相关函数以及logic相关函数,其他相关函数,比如math相关函 ...

  9. salesforce 零基础学习(六十七)SingleEmailMessage 那点事

    在salesforce开发中,发送邮件是一个很常见的功能.比如在进入审批流以后的通过和拒绝的操作需要发送邮件给记录的owner,和其他系统交互以后更改了某些状态通知相关的User或者Contact等等 ...

随机推荐

  1. JS概念

    1.This(当前方法属于谁,this就属于谁) http://www.cnblogs.com/yanhaijing/p/3685309.html#undefined

  2. kafka删除topic

    手动: 删除kafka存储目录(server.properties文件log.dirs配置,默认为"/tmp/kafka-logs")相关topic目录 删除zookeeper & ...

  3. 转载:solr MoreLikeThis的原理分析

    转载地址:http://blog.sina.com.cn/s/blog_5ddc071f0101muos.html 在solr中有两种方式实现MoreLikeThis:MoreLikeThisHand ...

  4. [MySQL] 数据统计 —— 按周,按月,按日分组统计数据

    知识关键词:DATE_FORMAT select DATE_FORMAT(create_time,'%Y%u') weeks,count(caseid) count from tc_case grou ...

  5. 『创意欣赏』30幅逼真的 3D 虚拟现实环境呈现

    又到周末了,给大家分享30幅漂亮的 3D 虚拟现实环境呈现,放松一下.这些创造性的场景都是通过 3D 图形设计软件,结合三维现实环境渲染制作出来的.一起欣赏:) 您可能感兴趣的相关文章 20幅温馨浪漫 ...

  6. 【Linux/Ubuntu学习4】ubuntu 下面安装 vim 的问题

    ubuntu 下面安装 vim 的问题 1.输入vim时,显示: 程序“vim”已包含在以下软件包中: * vim * vim-gnome * vim-tiny * vim-gtk * vim-nox ...

  7. iOS UILable的一些用法

    1.按钮上的文字添加下划线 问题:实现下图中右侧的按钮文字效果 代码(绿色为按钮文字加下划线方法): [MyTools createMyImageview:topEditView frame:CGRe ...

  8. Android之EditText文本变化的监听

    监听EditText的文本变化需要给EditText控件加一个addTextChangeListener监听器 editText.addTextChangeListener(textWatcher); ...

  9. Oracle基础 (系统工具(export,import)) exp/imp和 (数据泵 (data pump))expdp/impdp的区别:

    一.exp/imp和expdp/impdp在功能上的区别: 1.把用户usera的对象导入到userb emp/imp用法: formuser=usera touser=userb; empdp/im ...

  10. Spring Data Jpa 详解 (配置篇)

    前言: JPA全称Java Persistence API,即Java持久化API,它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据,结合其他ORM的使用,能达到简化开发 ...