内容提供者(内容提供者实现、使用场景、Uri、短信的备份与还原等等)

1.编写内容提供者

步骤:

1.在工程里创建一个类,继承ContentProvider,重写了onCreate和增删改查的方法;

2.在清单文件中配置一个provider,需要这个数据authorities,用来唯一标识内容者的,在android4.1版本之后需要exported="true"的属性,否则其他应用程序没有权限访问这个内容提供者;

3.在onCreate方法里得到数据库的帮助类;

2.内容提供者工作的原理

模版代码:

//uri匹配正时返回的匹配码

int code = mUriMatcher.match(uri);

if(code == INSERT){

System.out.println("你好,你添加多少都可以");

SQLiteDatabase db = helper.getWritableDatabase();

db.insert("account", null, values);

db.close();

}else

{

System.out.println("密码不正确!");

}

3.内容提供者的增删改查的实现

内容提供者:

package com.qaa.accountdb;

import android.content.ContentProvider;

import android.content.ContentValues;

import android.content.UriMatcher;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

import android.net.Uri;

public class AccountContentProvider extends ContentProvider {

private static final int INSERT = 1;

private static final int DELETE = 2;

private static final int UPDATE = 3;

private static final int QUERY = 4;

private AccountDBHelper helper;

//添加一个管理者,用来检查应用程序提供的uri路径是否正确

public static UriMatcher mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

//管理者培训,认识指定的口令

static{

mUriMatcher.addURI("com.qaa.accountdb", "insert", INSERT);

mUriMatcher.addURI("com.qaa.accountdb", "delete", DELETE);

mUriMatcher.addURI("com.qaa.accountdb", "update", UPDATE);

mUriMatcher.addURI("com.qaa.accountdb", "query", QUERY);    }

@Override

public boolean onCreate() {

helper = new AccountDBHelper(getContext());     return false;    }

@Override

public Uri insert(Uri uri, ContentValues values) {

//uri匹配正时返回的匹配码

int code = mUriMatcher.match(uri);

if(code == INSERT){

System.out.println("你好,你添加多少都可以");

SQLiteDatabase db = helper.getWritableDatabase();

db.insert("account", null, values);

db.close();

}else{

System.out.println("密码不正确!");

}

return null;

}

@Override

public Cursor query(Uri uri, String[] projection, String selection,

String[] selectionArgs, String sortOrder) {

//uri匹配正时返回的匹配码

int code = mUriMatcher.match(uri);

if(code == QUERY){

System.out.println("你好,你查询多少都可以");

SQLiteDatabase db = helper.getWritableDatabase();

Cursor cursor = db.query("account", projection, selection, selectionArgs, null, null, null);

return cursor;

}else{

System.out.println("密码不正确!");

return null;

}

}

@Override

public int update(Uri uri, ContentValues values, String selection,

String[] selectionArgs) {

int code = mUriMatcher.match(uri);

if(code == UPDATE){

System.out.println("你好,你修改多少都可以");

SQLiteDatabase db = helper.getWritableDatabase();

int n = db.update("account", values, selection, selectionArgs);

db.close();

return n;

}else{

System.out.println("密码不正确!");

return 0;

}

}

@Override

public int delete(Uri uri, String selection, String[] selectionArgs) {

int code = mUriMatcher.match(uri);

if(code == DELETE){

System.out.println("你好,你删除多少都可以");

SQLiteDatabase db = helper.getWritableDatabase();

int n = db.delete("account", selection, selectionArgs);

db.close();

return n;

}else{

System.out.println("密码不正确!");

return 0;

}

}

@Override

public String getType(Uri uri) {

return null;

}

}

在清单文件中配置内容提供者:

<!-- 在android4.1版本之后需要exported="true"的属性,否则其他应用程序没有权限访问这个内容提供者 -->

<provider android:name="com.qaa.accountdb.AccountContentProvider"

android:authorities="com.qaa.accountdb"

android:exported="true">

</provider>

其他应用程序访问内容提供者:

package com.qaa.bankboss;

import android.app.Activity;

import android.content.ContentResolver;

import android.content.ContentValues;

import android.database.Cursor;

import android.net.Uri;

import android.os.Bundle;

import android.view.View;

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

}

public void insert(View view){

//得到内容提供者的解析器,用来匹配内容提供者

ContentResolver resolver = getContentResolver();

Uri uri  = Uri.parse("content://com.qaa.accountdb/insert");

ContentValues values = new ContentValues();

values.put("name", "王");

values.put("money", "10000000");

//调用内容提供者,在数据库中添加一条数据

resolver.insert(uri, values);

}

public void update(View view){

//得到内容提供者的解析器,用来匹配内容提供者

ContentResolver resolver = getContentResolver();

Uri uri  = Uri.parse("content://com.qaa.accountdb/update");

ContentValues values = new ContentValues();

values.put("money", "20000000");

//调用内容提供者,在数据库中添加一条数据

resolver.update(uri, values, "name=?", new String[]{"王"});

}

public void query(View view){

//得到内容提供者的解析器,用来匹配内容提供者

ContentResolver resolver = getContentResolver();

Uri uri  = Uri.parse("content://com.qaa.accountdb/query");

//调用内容提供者,

Cursor cursor = resolver.query(uri, new String[]{"name","money"}, "name=?", new String[]{"王"}, null);

while(cursor.moveToNext()){

String name = cursor.getString(0);

String money = cursor.getString(1);

System.out.println("name="+name+"; money="+money);

}

cursor.close();

}

public void delete(View view){

//得到内容提供者的解析器,用来匹配内容提供者

ContentResolver resolver = getContentResolver();

Uri uri  = Uri.parse("content://com.qaa.accountdb/delete");

resolver.delete(uri, "name=?", new String[]{"行长"});

}

}

4.内容提供者的使用场景

内容提供者:主要是在自己的应用程序中提供访问数据库的接口(内容提供者);

内容提供者的解析器:主要是在别的应用程序中访问其他应用程序的内容提供者;

5.插入短信

address:电话号码

date:时间

type:1表示接收的短信,2发送出去的短信

body:短信内容

代码:

public void insert(View view){

String phone = et_phone.getText().toString().trim();

String content = et_content.getText().toString().trim();

ContentResolver resolver = getContentResolver();

Uri uri = Uri.parse("content://sms/");

ContentValues values = new ContentValues();

values.put("address", phone);

values.put("date", System.currentTimeMillis());

values.put("type", 1);

values.put("body", content);

resolver.insert(uri, values);

}

6.内容提供者uri的写法

uri:content://sms/  查询手机上所有的短信列表;

7.短信的备份

1.得到内容提供者的解析器,访问短信应用的内容提供者,查询手机上短信的列表:

(1)得到内容提供者的解析器

(2)访问短信应用的内容提供者,查询手机上短信的列表

2.把短信列表序列化到xml格式的文件上:

(1)得到一个xml的序列化器:

(2)初始化:

(3)把短信数据一条一条的序列化到xml格式的文件:

代码:

package cn.itcast.smsbackup;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.util.Date;

import org.xmlpull.v1.XmlSerializer;

import android.app.Activity;

import android.content.ContentResolver;

import android.database.Cursor;

import android.net.Uri;

import android.os.Bundle;

import android.os.Environment;

import android.util.Xml;

import android.view.View;

import android.widget.Toast;

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

}

// 点击按钮,备份手机系统里面的所有的短信

public void click(View view) {

try {

//得到内容提供者的解析器

ContentResolver resolver = getContentResolver();

Uri uri = Uri.parse("content://sms/");

//得到一个xml的序列化器

XmlSerializer  serializer = Xml.newSerializer();

//初始化

File file = new File(Environment.getExternalStorageDirectory(),"backup.xml");

FileOutputStream os = new FileOutputStream(file);

serializer.setOutput(os, "utf-8");

//写备份文件的xml头

serializer.startDocument("utf-8", true);

serializer.startTag(null, "info");

//访问短信应用的内容提供者,查询手机上短信的列表

Cursor cursor = resolver.query(uri, new String[] { "address", "date",       "type", "body" }, null, null, null);

while (cursor.moveToNext()) {

serializer.startTag(null, "sms");

String address = cursor.getString(0);

String date = cursor.getString(1);

String type = cursor.getString(2);

String body = cursor.getString(3);

serializer.startTag(null, "address");

serializer.text(address);

serializer.endTag(null, "address");

serializer.startTag(null, "date");

serializer.text(date);

serializer.endTag(null, "date");

serializer.startTag(null, "type");

serializer.text(type);

serializer.endTag(null, "type");

serializer.startTag(null, "body");

serializer.text(body);

serializer.endTag(null, "body");

serializer.endTag(null, "sms");

System.out.println("---------------");

}

cursor.close();

serializer.endTag(null, "info");

serializer.endDocument();

os.close();

Toast.makeText(this, "备份成功", 0).show();

} catch (Exception e) {

e.printStackTrace();

}

}

}

8.短信的还原操作

代码:

package cn.qaa.smsrestore;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import org.xmlpull.v1.XmlPullParser;

import android.app.Activity;

import android.app.AlertDialog;

import android.app.AlertDialog.Builder;

import android.content.ContentResolver;

import android.content.ContentValues;

import android.content.DialogInterface;

import android.content.DialogInterface.OnClickListener;

import android.net.Uri;

import android.os.Bundle;

import android.os.Environment;

import android.util.Xml;

import android.view.View;

import android.widget.Toast;

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

}

public void click(View view) {

final ContentResolver resolver = getContentResolver();

final Uri uri = Uri.parse("content://sms/");

// 还原短信, 把短信的内容插入到数据库.

// 为了避免短信的重复,在还原短信之前,提示用户是否删除旧的短信.

AlertDialog.Builder builder = new Builder(this);

builder.setTitle("提醒");

builder.setMessage("是否删除旧的短信?");

builder.setPositiveButton("删除", new OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

resolver.delete(uri, null, null);

// 还原短信

restoreSms();

}    });

builder.setNegativeButton("不删除", new OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

// 还原短信

restoreSms();

}

});

builder.show();

}

/**

* 还原短信

*/

private void restoreSms() {

try {

ContentResolver resolver = getContentResolver();

Uri uri = Uri.parse("content://sms");

// 读取sd卡的备份文件 xml文件.

File file = new File(Environment.getExternalStorageDirectory(),

"backup.xml");

FileInputStream fis = new FileInputStream(file);

// 解析xml文件.

XmlPullParser parser = Xml.newPullParser();

parser.setInput(fis, "utf-8");

int type = parser.getEventType();

SmsInfo smsInfo = null;

while (type != XmlPullParser.END_DOCUMENT) {

switch (type) {

case XmlPullParser.START_TAG:

if("sms".equals(parser.getName())){

smsInfo = new SmsInfo();

}else if("address".equals(parser.getName())){

smsInfo.address = parser.nextText();

}else if("date".equals(parser.getName())){

smsInfo.date = parser.nextText();

}else if("type".equals(parser.getName())){

smsInfo.type = parser.nextText();

}else if("body".equals(parser.getName())){

smsInfo.body = parser.nextText();

}

break;

case XmlPullParser.END_TAG:

if("sms".equals(parser.getName())){//一条短信结束.

ContentValues values = new ContentValues();

values.put("address", smsInfo.address);

values.put("date", smsInfo.date);

values.put("type", smsInfo.type);

values.put("body", smsInfo.body);

resolver.insert(uri, values);

}

break;

}

type = parser.next();

}

Toast.makeText(this, "还原短信成功", 0).show();

fis.close();

} catch (Exception e) {

e.printStackTrace();

}

}

class SmsInfo{

String body;

String address;

String type;

String date;

}

}

9.联系人数据库的表结构

raw_contacts:联系人的表  可以得到联系人的ID:contact_id

data:联系人的数据的表,每一天记录表示联系人的一个信息字段

mimetypes:联系人信息字段的类型

1.查看联系人应用提供的内容提供者,得到一个uri:

content://com.android.contacts/contacts

2.访问联系人应用的内容提供者,得到联系人列表:

代码:

package com.qaa.readcontacts;

import android.app.Activity;

import android.content.ContentResolver;

import android.database.Cursor;

import android.net.Uri;

import android.os.Bundle;

import android.view.View;

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

}

public void readContacts(View v) {

ContentResolver resolver = getContentResolver();

Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");

// 1、通过内容提供者去读raw_contacts中的数据

Cursor cursor = resolver.query(uri, new String[] { "contact_id" },      null, null, null);

while (cursor.moveToNext()) {

long contact_id = cursor.getLong(0);

System.out.println("contact_id==" + contact_id);

// 2、通过内容提供者去读data中的数据

Uri dataUri = Uri.parse("content://com.android.contacts/data/#"+contact_id);

Cursor dataCursor = resolver.query(dataUri, new String[] {       "raw_contact_id", "mimetype", "data1" }, null, null, null);

while(dataCursor.moveToNext()){

long raw_contact_id = dataCursor.getLong(0);

String mimetype = dataCursor.getString(1);

String data = dataCursor.getString(2);

System.out.println("raw_contact_id=="+raw_contact_id);

System.out.println("mimetype=="+mimetype);

System.out.println("data=="+data);

}

dataCursor.close();

System.out.println("----------------------------------");

}

cursor.close();

}

}

10.联系人的还原

向raw_contacts、data

11.内容观察者&短信listener

内容观察者可以看到内容提供者中数据变化;

12.内容观察者

package com.qaa.contentobserver;

import java.util.Date;

import android.app.Activity;

import android.content.ContentResolver;

import android.database.ContentObserver;

import android.database.Cursor;

import android.net.Uri;

import android.os.Bundle;

import android.os.Handler;

public class MainActivity extends Activity {

private ContentResolver resolver;

private Uri uri;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

resolver = getContentResolver();

uri = Uri.parse("content://sms/");

resolver.registerContentObserver(uri, true, new MyContentObserver(

new Handler()));  }

private class MyContentObserver extends ContentObserver {

public MyContentObserver(Handler handler) {

super(handler);

}

/**

* 内容提供者中数据发生变后调用这个方法

*/

@Override

public void onChange(boolean selfChange) {

Cursor cursor = resolver.query(uri, new String[] { "address",

"date", "type", "body" }, null, null, "date desc");

cursor.moveToNext();

String phone = cursor.getString(0);

long date = cursor.getLong(1);

String type = cursor.getString(2);

String body = cursor.getString(3);

System.out.println("phone==="+phone);

System.out.println("date==="+new Date(date).toLocaleString());

System.out.println("type==="+type);

System.out.println("body==="+body);

cursor.close();

super.onChange(selfChange);

}

}

}

时间: 2024-08-25 23:08:31

内容提供者(内容提供者实现、使用场景、Uri、短信的备份与还原等等)的相关文章

无废话Android之listview入门,自定义的数据适配器、采用layoutInflater打气筒创建一个view对象、常用数据适配器ArrayAdapter、SimpleAdapter、使用ContentProvider(内容提供者)共享数据、短信的备份、插入一条记录到系统短信应用(3)

1.listview入门,自定义的数据适配器 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent&

Redis 应用场景之短信验证码

应用场景 以 OSChina 账号注册 为例...讲错了请留言批评指正... 逻辑场景 用户操作: 用户输入手机号, 然后点击获取验证码. 前端逻辑: ajax 发起请求, 参数带上手机号. 后端逻辑: 获取请求参数, 生成6位数验证码, 给指定手机号发送短信, 并缓存一个30秒过期的键值, mobilephone=checkcode, 比如 135xxx=123456 用 redis-cli 操作的话命令如下: // 设置一个缓存 key=手机号 value=验证码, 30秒后过期自动删除 1

【android基础篇】利用内容提供者实现短信备份

I,准备工作 系统存储短信内容的目录为:/dada/dada/com.android.providers.telephony/databases/mmssms.db,我们找到对应的数据库文件. 我们可以发现该文件对于第三方而言,是不可读不可写的,这里则必须要使用内容提供者. 问题就来了:我不知道主机名,也就无法作为中间人去找证监会打探消息.其实,完全没有关系,我们可以翻阅安卓的源代码: \packages\providers\TelephonyProvider的清单文件,因为主机名都配置在清单文

内容观察者(一个简单的手机短信窃听器)

一丶内容观察者  * 在内容提供者中要通知内容发生了变化         getContext().getContentResolver().notifyChanges(uri,null) ; //null表示没有固定的接收者  * 在其他应用中写一个观察者,并注册一个实例         getContentResolver().registerContentObserver(uri,true,Observer) ; //uri观察的主机数据,true表示只要主机匹配即可,Observer表示

android 内容观察者之短信窃听器

步骤: 1.获取内容观察者 ContentResolver contentResolver = getContentResolver(); 2.为观察的内容注册观察(也就是在android短信里面的空间,添加观察者) // uri 短息的地址 // true 代表短信地址符合都行,false代表必须一模一样 // 添加的观察者,做什么事情 Uri uri = Uri.parse("context://sms/"); // 短信 contentResolver.registerConte

如何获取短信内容

如何获取短信的内容?1.编写一个广播接收器类,该类去集成BroadCastReceiver在onReceive()方法中处理广播关键的Java代码: 1 public void onReceive(Context context,Intent intent){ 2 Bundle bundle=intent.getExtras(); 3 if(bundle!=null){ 4 //获得收到的数据 5 Object[] objArray=(Object[])bundle.get("pdus"

怎样恢复手机删除的短信内容

手机短信删除了怎么恢复?怎么最简单的恢复手机短信?误删的短信应该如何找回?最简单的找回方法这里来教你.不知道大家有没有在各种垃圾短信的删除时候,出现将重要的短信误删的情况.对于迷糊的小编就会经常的遇到这种情况.重要的短信误删了,真的会很麻烦,没有对应的短信一些操作就会无法进行.那么应该怎么办才能将误删的短信找回了,今天小编就和大家分享一种在手机上就可进行短信找回的方法,下面一起看一看吧.具体的操作步骤如下:第一步:在手机的软件管理市场,搜索并下载"极速数据恢复"软件,这款工具可以恢复手

短信的内容提供者Uri和短信表结构

* sms表 * address :手机号码 * date :收发短信的时间 * read :短信的阅读状态 1,已读 0,未读 * type :收发短信的类型 1,收到短信 2,发出短信 * body :短信内容 * URI: content://sms/

使用内容提供者备份短信

1.获取短信的权限配置 1 <uses-permission android:name="android.permission.READ_SMS"/> 2 <uses-permission android:name="android.permission.WRITE_SMS"/> 2.通过内容提供者获取短信内容 1 package com.example.readsysmsm; 2 3 import java.util.ArrayList;