基础学习总结(六)--getContentRolver()的应用、内容监听者ContentObserver
短信的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的更多相关文章
- salesforce 零基础学习(六十八)http callout test class写法
此篇可以参考: https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_restfu ...
- salesforce 零基础学习(六十九)当新增/修改一条记录以后发生了什么(适合初学者)
salesforce开发中,我们会对object进行很多的操作,比如对object设置字段的必填性唯一性等,设置validation rule实现一下相关的字段的逻辑校验,设置workflow实现某个 ...
- Java基础学习(六)-- 递归以及文件I/O流基础详解
递归 1.递归的概念: 在函数自身内部,调用函数本身的方式,称为递归. 2.递归的注意事项:包括递进去,归出来两步. 即:首先依次执行[函数调自身语句]上半部分的代码,知道最里层.(递进去),然后 ...
- salesforce 零基础学习(六十)Wizard样式创建数据
项目中表之间关联关系特别多,比如三个表中A,B,C C作为主表,A,B作为从表,有时候C表需要创建数据时,同时需要创建A,B两个表的数据,这种情况下,使用Wizard样式会更加友好. 以Goods_ ...
- 【JavaScript基础学习】关于正则表达式的完整内容
w3cJavaScript RegExp对象 这个如果第一次看的话应该会很莫名其妙,但可以看一遍留个印象. 正则表达式30分钟入门教程 这个教程非常完整,走一遍大概能够明白怎么回事了. 正则表达式在 ...
- javascript基础学习(六)
javascript之对象 学习要点: 对象的属性和方法 对象的原型 一.对象 对象其实就是一种引用类型,而对象的值就是引用对象的实例. 二.创建对象 在javascript中有两种对象,一种是系统内 ...
- salesforce 零基础学习(六十五)VF页面应善于使用变量和函数(一)常用变量的使用
我们在使用formula或者validation rules等的时候通常会接触到很多function,这些函数很便捷的解决了我们很多问题.其实很多函数也可以应用在VF页面中,VF页面有时候应该善于使用 ...
- salesforce 零基础学习(六十六)VF页面应善于使用变量和函数(二)常用函数的使用
上一篇介绍VF中常用的变量,此篇主要内容为VF页面可以直接使用的函数,主要包括Date相关函数,Text相关函数,Information相关函数以及logic相关函数,其他相关函数,比如math相关函 ...
- salesforce 零基础学习(六十七)SingleEmailMessage 那点事
在salesforce开发中,发送邮件是一个很常见的功能.比如在进入审批流以后的通过和拒绝的操作需要发送邮件给记录的owner,和其他系统交互以后更改了某些状态通知相关的User或者Contact等等 ...
随机推荐
- Windows 之 删除保存的共享凭据(用户名和密码)
当我们在访问Windows共享文件夹或者NAS网络共享盘的时候,Windows会提示输入访问共享所需要的用户名和密码,如果我们勾选了“记住我的凭据”,Windows 就会将认证凭据保存到计算机中,以方 ...
- Post Robot
Problem Description DT is a big fan of digital products. He writes posts about technological product ...
- A+B Coming
Problem Description Many classmates said to me that A+B is must needs.If you can’t AC this problem, ...
- linux记录登录ip方法
PS:Linux用户操作记录一般通过命令history来查看历史记录,但是如果因为某人误操作了删除了重要的数据,这种情况下history命令就不会有什么作用了.以下方法可以实现通过记录登陆IP地址和所 ...
- Solr DIH dataconfig配置
1. 配置文件data-config.xml定义了数据库的基本配置,以及导出数据的映射规则,即导出数据库表中对应哪些字段的值,以及对特定字段的值做如何处理 </pre><p>& ...
- TextRank算法提取关键词的Java实现
转载:码农场 » TextRank算法提取关键词的Java实现 谈起自动摘要算法,常见的并且最易实现的当属TF-IDF,但是感觉TF-IDF效果一般,不如TextRank好. TextRank是在 G ...
- Oracle基础(六) 数据类型
一.Oracle中的数据类型 Oracle中提供了丰富的数据类型,用来存储数据,主要包括: 1.字符类型:主要用来存储字符串类型的数据. 数据类型 长度 说明 CHAR(n BYTE/CHAR) 默认 ...
- Oracle 基础——索引
一.索引 索引是一种快速访问数据的途径,可提高数据库性能.索引使数据库程序无须对整个表进行扫描,就可以在其中找到所需的数据,就像书的目录,可以快速查找所需的信息,无须阅读整本书. 二.索引存在的问题 ...
- 剑指Offer11 在O(1)内删除链表结点
/************************************************************************* > File Name: 11_Delete ...
- android 开源库集合的链接列表
1. 内容挺多的 https://github.com/Trinea/android-open-project