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. .NET开发必备工具之-Reflector

    第一步,下载 第二步,解压缩下载的包,双击Reflector应用程序打开 第三步,设置默认程序集,可以不设定 第四步,找到你要反编译dll文件 第五步,把dll文件拷贝到方便的位置(我在桌面上新建了T ...

  2. VSS 之 未知的用户名或密码错误

    原因:导致这种现象的原因并不是真的用户名和密码错误,而是验证失败.验证失败也自然就会提示成用户名或密码错误了,只需要做以下更改就能正常验证用户名和密码了.解决方案:运行 组策略编辑器 gpedit.m ...

  3. solr 范围查询

    []表示查询一个包括边界范围, {}表示查询一个不包括边界范围 A TO * 表示没有上界即>=A或是>A ,视使用的是[]还是{}而定 * TO A 表示没有下界即<=A或是< ...

  4. 用JDBC查询数据库

    JDBC API的核心组件:1.DriverManager类:用语跟踪可用的JDBC驱动程序并产生数据库连接. 2.Connection接口:用于取得数据库信息.生成数据库语句,并管理数据库事务. 3 ...

  5. Ubuntu15.10使用mysql

    安装 sudo apt-get install mysql-server sudo apt-get install mysql-client sudo apt-get install libmysql ...

  6. React Native学习-将 'screen', 'window' or a view生成图片

    https://github.com/facebook/react-native/commit/ac12f986899d8520527684438f76299675dc0daa 这是react-nat ...

  7. Windows 7 无线网络故障

    朋友打电话来问为何他的PC不能连接到家里的无线网络,而手机等其他设备都可以?相互交谈之中,我问如下几个问题: 是否可以搜索到其他无线网络? 答:是.(想确实无线网卡工作是否正常) 新的手机是否可以连接 ...

  8. 2075 yh女朋友的危机、2544 拯救小矮人

    Codevs2075和2544是一道题,直接A过. 2075 yh女朋友的危机  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果   ...

  9. 【转】PS学堂之一:展示一下自己做的圆形印章

    共分七个步骤: 1.点击文件--新建,新建一个500×500像素,背景为透明的文件,选择RGB颜色. 2.把前景色和文字颜色设置为正红(R为255,G和B为0). 3.在视图下拉菜单中选择标尺,将横. ...

  10. django 学习-17 Django会话Session

    session   类似于字典的一个对象,是可读可写的 跟cookie的变化不大而且还显得简单 在这里我只说一下改变的地方 1.vim blog/views.py if uf.is_valid():  ...