关于Android短信的解析

来源:互联网 发布:天刀丐帮捏脸数据男 编辑:程序博客网 时间:2024/06/16 13:26

说一下短信的解析过程,这个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;@Overrideprotected 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(){@Overridepublic 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");        }    }};@Overridepublic 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打印出来,如下