文档章节

Android短信操作(通过内容提供者)

维特的烦恼
 维特的烦恼
发布于 2014/01/25 14:57
字数 765
阅读 82
收藏 2

1、Android短信数据库表结构

 

URI主要有:

content://sms/               所有短信
content://sms/inbox        收件箱
content://sms/sent          已发送
content://sms/draft         草稿
content://sms/outbox     发件箱
content://sms/failed       发送失败
content://sms/queued    待发送列表


sms主要结构:   

  1. _id => 短消息序号 如100  
  2. thread_id => 对话的序号 如100  
  3. address => 发件人地址,手机号.如+8613811810000  
  4. person => 发件人,返回一个数字就是联系人列表里的序号,陌生人为null  
  5. date => 日期  long型。如1256539465022  
  6. protocol => 协议 0 SMS_RPOTO, 1 MMS_PROTO   
  7. read => 是否阅读 0未读, 1已读   
  8. status => 状态 -1接收,0 complete, 64 pending, 128 failed   
  9. type => 类型 1是接收到的,2是已发出   
  10. body => 短消息内容   
  11. service_center => 短信服务中心号码编号。如+8613800755500

所有字段:

 

sms数据库中的字段如下:

_id               一个自增字段,从1开始
thread_id    序号,同一发信人的id相同
address      发件人手机号码
person        联系人列表里的序号,陌生人为null 
date            发件日期
protocol      协议,分为: 0 SMS_RPOTO, 1 MMS_PROTO  
read           是否阅读 0未读, 1已读  
status         状态 -1接收,0 complete, 64 pending, 128 failed 
type     
    ALL    = 0;
    INBOX  = 1;
    SENT   = 2;
    DRAFT  = 3;
    OUTBOX = 4;
    FAILED = 5;
    QUEUED = 6;
 
body                     短信内容
service_center     短信服务中心号码编号
subject                  短信的主题
reply_path_present     TP-Reply-Path
locked    

字段源码:

private void createSmsTables(SQLiteDatabase db) {
        // N.B.: Whenever the columns here are changed, the columns in
        // {@ref MmsSmsProvider} must be changed to match.
        db.execSQL("CREATE TABLE sms (" +
                   "_id INTEGER PRIMARY KEY," +
                   "thread_id INTEGER," +
                   "address TEXT," +
                   "person INTEGER," +
                   "date INTEGER," +
                   "date_sent INTEGER DEFAULT 0," +
                   "protocol INTEGER," +
                   "read INTEGER DEFAULT 0," +
                   "status INTEGER DEFAULT -1," + // a TP-Status value
                                                  // or -1 if it
                                                  // status hasn't
                                                  // been received
                   "type INTEGER," +
                   "reply_path_present INTEGER," +
                   "subject TEXT," +
                   "body TEXT," +
                   "service_center TEXT," +
                   "locked INTEGER DEFAULT 0," +
                   "error_code INTEGER DEFAULT 0," +
                   "seen INTEGER DEFAULT 0" +
                   ");");
....
}


 

2、操作代码(拿到contentProvider的Uri即可进行增删改查操作十分简易)(注意:敏感数据需要申请权限android.permission.READ_SMS

android.permission.WRITE_SMS

package com.pas.getsms;

import java.io.File;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import org.xmlpull.v1.XmlSerializer;

import com.pas.model.SmsInfo;

import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.text.format.DateFormat;
import android.util.Xml;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity
{

	private List<SmsInfo> smslist;

	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu)
	{
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	public void click(View view)
	{
		smslist = new ArrayList<SmsInfo>();
		Uri uri = Uri.parse("content://sms/");
		ContentResolver resolver = getContentResolver();
		Cursor cursor = resolver.query(uri, new String[]
		{ "address", "date", "type", "body" }, null, null, null);
		while (cursor.moveToNext())
		{
			String address = cursor.getString(0);
			String date = cursor.getString(1);
			String type = cursor.getString(2);
			String body = cursor.getString(3);

			SmsInfo smsInfo = new SmsInfo(address, type, date, body);
			smslist.add(smsInfo);
		}
		cursor.close();
		backupData();
	}

	private void backupData()
	{
		try
		{
			String ENCODING = "utf-8";
			XmlSerializer serializer = Xml.newSerializer();
			File file = new File(this.getExternalFilesDir(null), "back.xml");
			FileOutputStream fos = new FileOutputStream(file);
			serializer.setOutput(fos, ENCODING);
			serializer.startDocument(ENCODING, true);
			serializer.startTag(null, "smses");
			for (SmsInfo sms : smslist)
			{
				serializer.startTag(null, "sms");
				
				serializer.startTag(null, "address");
				serializer.text(sms.getAddress());
				serializer.endTag(null, "address");
				
				serializer.startTag(null, "body");
				serializer.text(sms.getBody());
				serializer.endTag(null, "body");
				
				serializer.startTag(null, "date");
				serializer.text(sms.getDate());
				serializer.endTag(null, "date");
				
				serializer.startTag(null, "type");
				serializer.text(sms.getType());
				serializer.endTag(null, "type");
				
				serializer.endTag(null, "sms");
			}

			serializer.endTag(null, "smses");
			serializer.endDocument();
			fos.close();
			Toast.makeText(this, "备份成功", Toast.LENGTH_SHORT).show();
		} catch (Exception e)
		{
			e.printStackTrace();
			// Toast.makeText(this, e.getMessage(), 0).show();
		}

	}
	
	public void addSms(View view)
	{
		new Thread()
		{
			@Override
			public void run()
			{
				try
				{
					sleep(50000);
					smslist = new ArrayList<SmsInfo>();
					Uri uri = Uri.parse("content://sms/");
					ContentResolver resolver = getContentResolver();
					ContentValues values=new ContentValues();
					values.put("address", "95533");
					values.put("type", 1);
					values.put("date", System.currentTimeMillis());
					values.put("body", "到账100,000,000元");
					resolver.insert(uri, values);
				} catch (InterruptedException e)
				{
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
		}.start();
		
		
	}
}


© 著作权归作者所有

维特的烦恼
粉丝 20
博文 97
码字总数 42329
作品 0
天津
私信 提问
加载中

评论(1)

小张java
楼主,我有个问题,麻烦你给看看。
我使用内容提供者模拟了下发送假短信的功能,类似于上面的 public void addSms(View view)方法,但是不能在系统的mmssms.db中添加短信(我已经在清单文件中国加了读写短信的权限),后台的日志中没有报错,我跟踪了下代码,确实执行了contentResolver.insert(uri, values); 这行代码,奇怪的是我把mmssms.db倒出来后,却没有新增的数据,楼主知道是怎么一回事吗?是不是模拟器使用的API的版本不支持此项功能?
Android系统架构 四大组件

Android 系统架构 是怎么样工作的。 Linux 内核层 Android 系统是基于Linux内核的 ,这一层为安卓设备的各种硬件提供了底层驱动,如显卡驱动,音频驱动,照相机驱动,蓝牙WIFi电源等驱动 系统...

一箭落旄头
2018/10/08
0
0
Android使用内容提供者方式进行存储

内容提供者(ContentProvider)主要作用是对外共享数据,如果数据通过内容提供者对外共享了,那么其他应用就可以从内容提供者中查询到数据,并且可更新数据、删除数据、添加数据,如果采用文件...

IBMdW
2011/09/26
715
0
安卓内容观察者 观察的具体对象

内容观察者 观察的对象是什么? 是直接观察数据库,还是观察Uri对应的内容提供者 如果是观察内容提供者的 那为什么发送短信的时候 他能监测到 难道发送短信这个应用 是经过本应用的内容提供者实...

J_Rong
2016/10/12
109
0
Android层次化安全架构及核心组件概览

更多文章请见:http://mobile.51cto.com/abased-346081.htm Android系统承袭了Linux开源操作系统的安全特性,并采用了层次化的方式来保证系统安全,本文将详细介绍Android层次化安全架构及其核...

samsunglinux
2018/07/02
0
0
Android应用程序基础(Application Fundamentals)之一

正在尝试分析SDK中的示例程序NotePad,发现仍然还欠缺很多知识。今天看到 API Guides 下有一部分应用程序基础 Application Fundamentals,感觉需要进一步学习。于是准备采用之前的策略,边翻...

AllenYao
2013/01/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

spring 本类中方法调用另外一个方法事务不生效

1、在spring配置文件中添加 <aop:aspectj-autoproxy expose-proxy="true"/> 声明自动代理 2、AopContext.currentProxy()来获取代理类 3、使用代理类proxy进行代理调用内部声明了事务的方法 ......

重城重楼
7分钟前
0
0
项目 banner 乱弹

------------------------------------------ 村上春树 ------------------------------------- 如果我爱你,而你也正巧爱我,你头发乱了的时候,我会笑笑地替你拨一拨,然后手还留恋地在你...

宿小帅
19分钟前
0
0
PHP获取未来七天的日期和星期

php获取未来七天的日期和星期代码 第一步:获取需要天数的日期,然后调用函数 //获取未来七天的日期 for($i=1;$i<8;$i++){ $dateArray[$i]=date('Y-m-d',strtotime(d...

一只懒猫-
30分钟前
0
0
总结:IO模型

分类 多路复用 参考文章: https://www.jianshu.com/p/6a6845464770 https://www.cnblogs.com/zingp/p/6863170.html https://blog.csdn.net/sehanlingfeng/article/details/78920423......

浮躁的码农
34分钟前
0
0
fabric-sdk-java 1.4安装说明

Hyperledger Fabric Java SDK是开发基于Hyperledger Fabric区块链的Java应用之必备开发包。本文将介绍如何在Maven、Gradle和Eclipse中安装使用最新1.4版本的Hyperledger Fabric Java SDK。 ...

汇智网教程
35分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部