说一下短信的解析过程,这个demo是以解析移动流量为目的,通过点击按钮发送短信从而解析出当月已使用的流量情况,代码如下
package jianhui.zhang;
import java.util.Calendar;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import android.os.Bundle;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.telephony.SmsManager;
import android.telephony.SmsMessage;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import android.view.View.OnClickListener;
import android.provider.Settings;
public class SmsParse extends Activity {
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
final String SMS_RECEIVEDS = "android.provider.Telephony.SMS_RECEIVED";
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn = (Button)findViewById(R.id.btn);
tv = (TextView)findViewById(R.id.tv);
btn.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
Calendar c = Calendar.getInstance();
c.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH), 1);
c.roll(Calendar.DATE, false);
int day = c.get(Calendar.DATE);
Log.e("jihui","--------" + day);
// TODO Auto-generated method stub
/*Uri uri = Uri.parse("smsto:10086");
Intent intent = new Intent(Intent.ACTION_SENDTO,uri);
intent.putExtra("sms_body", "cxll");
startActivity(intent);*/
SmsManager sms=SmsManager.getDefault();
PendingIntent mPI=PendingIntent.getBroadcast(SmsParse.this,0,new Intent(),0);
sms.sendTextMessage("10086",null,"cxll",mPI,null);//发送10086的查询短信
// String net = Settings.System.getString(getContentResolver(),
// Settings.System.NEXT_ALARM_FORMATTED);
// Log.e("jihui","--------------------"+net);
}
});
registerReceiver(SmsReceiver,new IntentFilter(SMS_RECEIVEDS));
}
//解析短信,先读取信息到字符串sb中,再通过正则表达式两次解析得到已使用的流量值
private BroadcastReceiver SmsReceiver = new BroadcastReceiver(){
public void onReceive(Context context,Intent intent){
Log.e("jihui---------------","sms");
if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED"))
{
//abortBroadcast();
Pattern pat = Pattern.compile("已使用(.*?)M");//解析出"已使用...M"样式的语句
Pattern pats = Pattern.compile("[\\d]+\\.[\\d]+");//解析出"已使用...M"语句中的数字
StringBuilder text= new StringBuilder();;
StringBuilder sb = new StringBuilder();
Bundle bundle = intent.getExtras();
if(bundle!= null)
{
Object[] pdus = (Object[]) bundle.get("pdus");
SmsMessage[] messages = new SmsMessage[pdus.length];
for(int i=0;i<pdus.length;i++)
{
messages[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
}
for(SmsMessage message:messages)
{
sb.append("短信来源");
sb.append(message.getDisplayOriginatingAddress());
sb.append(message.getDisplayMessageBody());
text.append(message.getDisplayMessageBody());
}
}
Toast.makeText(context, sb.toString(), 5000).show();
Matcher mat = pat.matcher(text);
if(mat.find()){
System.out.println(mat.group());
}
//mats = pats.matcher(mat.group());
Matcher mats = pats.matcher(mat.group());
if(mats.find()){
System.out.println(mats.group());
}
tv.setText(text);
}else if(intent.getAction().equals("android.intent.action.TIME_SET")){
Log.e("jihui","--------------------timeset");
}
}
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.sms_parse, menu);
return true;
}
}
main.xml代码如下
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".SmsParse" >
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/parse"/>
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/btn"
android:text="@string/hello_world" />
</RelativeLayout>
最后记得在Manifest里加上权限
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
主界面里显示的是收到的短信,而解析出来的通过log打印出来,如下