首先,如要将信息插入到手机短信中去,要先知道短信在数据库中字段的形式。
数据库中短信的相关字段如下:
address: 发件人手机号码
date: 发件日期
protocol: 协议,分为:0 短信; 1 彩信
read: 是否阅读 0 未读; 1 已读
type: ALL = 0;
INBOX = 1; 收件箱
SENT = 2; 已发送
DRAFT = 3; 草稿
OUTBOX = 4; 发件箱
FAILED = 5; 发送失败
QUEUED = 6; 待发送列表
body: 短信内容
在这自己只获取了这6个字段,其他字段例如service_center:短信服务中心号码编号,subject:短信主体等字段如有需要可自行添加。
然后我们写一个包含两个Button的xml文件:
<LinearLayout 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"
android:orientation="vertical" >
<Button
android:id="@+id/smsRead"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="解析短信xml"/>
<Button
android:id="@+id/smsWrite"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="写入短信"/>
</LinearLayout>
在这里别忘了在AndroidMainFest加上写入短信的权限:<uses-permission android:name="android.permission.WRITE_SMS" />
我解析的是一个简单的xml文件,再将xml文件放在assets文件下,若要从其他地方获取xml文件,修改路径即可,以下是xml文件的格式:
<pre name="code" class="plain"><?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<sms>
<item>
<person>张三</person>
<address>123456789</address>
<date>2015-07-30 10:18:59</date>
<protocol>短信</protocol>
<read>已读</read>
<type>已发送</type>
<body>我过会儿打给您。</body>
</item>
<item>
<person>李四</person>
<address>987654321</address>
<date>2015-07-30 10:18:59</date>
<protocol>短信</protocol>
<read>已读</read>
<type>收件箱</type>
<body>王婆卖瓜,自卖自夸</body>
</item>
</sms>
首先,我们解析xml文件,自己采用的是pull解析,xml的解析方式有SAX解析,DOM解析,PULL解析三种方式,可自行选择适合自己的方式进行解析。在这里,我们定义一个PullMsgParser类来作为我们解析xml的工具,一个MsgBean用来保存字段,里面有name,phone,time,protocol,read,type,body六个属性,在这就不贴代码了
<pre name="code" class="java">public class PullMsgParser {
private MsgBean msg;
private List<MsgBean> msgs;
public List<MsgBean> parse(InputStream is) throws Exception {
XmlPullParser parser = Xml.newPullParser();
parser.setInput(is, "UTF-8");
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
msgs = new ArrayList<MsgBean>();
break;
case XmlPullParser.START_TAG:
if (parser.getName().equals("item")) {
//单例模式只初始化一次
msg = getInstance();
} else if (parser.getName().equals("person")) {
eventType = parser.next();
msg.setName(parser.getText());
} else if (parser.getName().equals("address")) {
eventType = parser.next();
msg.setPhone(parser.getText());
} else if (parser.getName().equals("date")) {
eventType = parser.next();
msg.setTime(parser.getText());
} else if (parser.getName().equals("protocol")) {
eventType = parser.next();
msg.setProtocol(parser.getText());
} else if (parser.getName().equals("read")) {
eventType = parser.next();
msg.setRead(parser.getText());
} else if (parser.getName().equals("type")) {
eventType = parser.next();
msg.setType(parser.getText());
} else if (parser.getName().equals("body")) {
eventType = parser.next();
msg.setBody(parser.getText());
}
break;
case XmlPullParser.END_TAG:
if (parser.getName().equals("item")) {
msgs.add(msg);
msg = null;
}
break;
}
eventType = parser.next();
}
return msgs;
}
/**
* 只初始化一次
*
* @return
*/
MsgBean getInstance() {
if (msg == null) {
msg = new MsgBean();
}
return msg;
}
}
接下来就剩下把解析的xml数据插入到手机中去了:
public class MainActivity extends Activity implements OnClickListener{
//数据库表的地址
public static Uri mSmsUri = Uri.parse("content://sms/inbox");
private PullMsgParser parser;
private List<MsgBean> msgs;
private Button readSms;
private Button writeSms;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
/*
* 初始化控件
* */
private void initView() {
readSms = (Button) findViewById(R.id.smsRead);
writeSms = (Button) findViewById(R.id.smsWrite);
readSms.setOnClickListener(this);
writeSms.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.smsRead:
readSmsXml();
break;
case R.id.smsWrite:
writeSms();
break;
default:
break;
}
}
private void writeSms() {
if(msgs != null){
for (MsgBean msg : msgs) {
try {
//将xml数据写入到短信数据库
msgInsert(msg.getPhone(), msg.getBody(),
msg.getTime(), msg.getRead(), msg.getType(),
msg.getProtocol());
} catch (ParseException e) {
e.printStackTrace();
}
}
}else{
Toast.makeText(this, "请先解析xml文件", Toast.LENGTH_SHORT).show();
}
}
private void readSmsXml() {
try {
//获取assets文件下的xml文件
InputStream is = getAssets().open("sms.xml");
//初始化
parser = new PullMsgParser();
//解析xml文件
msgs = parser.parse(is);
//遍历 输出解析好的xml
for (MsgBean msg : msgs) {
System.out.println(msg.SysMsg());
}
} catch (Exception e) {
e.printStackTrace();
}
}
protected void msgInsert(String phone, String body, String time,
String read, String type, String protocal) throws ParseException {
ContentValues values = new ContentValues();
values.put("address", phone);
values.put("body", body);
//时间类型转换成long型
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date dt = sdf.parse(time);
long lTime = dt.getTime();
values.put("date", lTime);
if (read.equals("未读")) {
values.put("read", 0);
} else if (read.equals("已读")) {
values.put("read", 1);
}
if (type.equals("收件箱")) {
values.put("type", 1);
} else if (type.equals("已发送")) {
values.put("type", 2);
} else if(read.equals("草稿")){
values.put("type", 3);
} else if(read.equals("发送中")){
values.put("type", 4);
} else if(read.equals("失败")){
values.put("type", 5);
} else if(read.equals("待发送")){
values.put("type", 6);
} else{
values.put("type", 0);
}
if (protocal.equals("短信")) {
values.put("protocol", 0);
} else if (protocal.equals("彩信")) {
values.put("protocol", 1);
}
getContentResolver().insert(mSmsUri, values);
}
}
这样,解析xml并插入到手机短信中就完成了。