Android短信监听(二)——利用ContentObserver实现短信监听

来源:互联网 发布:申请mac邮箱地址 编辑:程序博客网 时间:2024/05/29 05:54

MainActivity如下:

package cc.testsmslistener;import cc.testsmslistener.SMSContentObserver.MessageListener;import android.net.Uri;import android.os.Bundle;import android.os.Handler;import android.widget.TextView;import android.app.Activity;/** * Demo描述: * 利用ContentObserver实现短信监听 *  * 注意权限: * <uses-permission android:name="android.permission.READ_SMS" /> *  * 参考资料: * http://blog.csdn.net/peijiangping1989/article/details/7368178 * Thank you very much * */public class MainActivity extends Activity {private TextView mTextView;//所有短信public static final String URI = "content://sms/";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);init();}private void init() {mTextView=(TextView) findViewById(R.id.textView);//注册内容观察者SMSContentObserver smsContentObserver =     new SMSContentObserver(new Handler(),this);this.getContentResolver().registerContentObserver(Uri.parse(URI), true, smsContentObserver);//回调smsContentObserver.setOnReceivedMessageListener(new MessageListener() {@Overridepublic void OnReceived(String message) {mTextView.setText(message);}});}}

SMSContentObserver如下:

package cc.testsmslistener;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.database.ContentObserver;import android.database.Cursor;import android.net.Uri;import android.os.Handler;public class SMSContentObserver extends ContentObserver {//所有短信public static final String SMS_URI_ALL = "content://sms/";//收件箱短信public static final String SMS_URI_INBOX = "content://sms/inbox"; //发件箱短信public static final String SMS_URI_SEND = "content://sms/sent";//草稿箱短信public static final String SMS_URI_DRAFT = "content://sms/draft";private Activity mActivity;private List<SmsInfo> mSmsInfoList;private MessageListener mMessageListener;public SMSContentObserver(Handler handler, Activity activity) {super(handler);this.mActivity = activity;}@Overridepublic void onChange(boolean selfChange) {super.onChange(selfChange);Uri uri = Uri.parse(SMS_URI_INBOX);mSmsInfoList = this.getSmsInfo(uri,mActivity);mMessageListener.OnReceived(mSmsInfoList.get(0).getSmsbody());System.out.println("Message content is:"+mSmsInfoList.get(0).getSmsbody());System.out.println("Message info is:"+mSmsInfoList.get(0));}/** * 注意: * 该处只用按照时间降序取出第一条即可 * 这条当然是最新收到的消息 */private List<SmsInfo> getSmsInfo(Uri uri,Activity activity){List<SmsInfo> smsInfoList=new ArrayList<SmsInfo>();String[] projection = new String[] { "_id", "address", "person","body", "date", "type" };Cursor cusor = activity.managedQuery(uri, projection, null, null,"date desc limit 1");int nameColumn = cusor.getColumnIndex("person");int phoneNumberColumn = cusor.getColumnIndex("address");int smsbodyColumn = cusor.getColumnIndex("body");int dateColumn = cusor.getColumnIndex("date");int typeColumn = cusor.getColumnIndex("type");if (cusor != null) {while (cusor.moveToNext()) {SmsInfo smsinfo = new SmsInfo();smsinfo.setName(cusor.getString(nameColumn));smsinfo.setDate(cusor.getString(dateColumn));smsinfo.setPhoneNumber(cusor.getString(phoneNumberColumn));smsinfo.setSmsbody(cusor.getString(smsbodyColumn));smsinfo.setType(cusor.getString(typeColumn));smsInfoList.add(smsinfo);}cusor.close();}System.out.println("smsInfoList.size()="+smsInfoList.size());return smsInfoList;}// 回调接口public interface MessageListener {public void OnReceived(String message);}public void setOnReceivedMessageListener(MessageListener messageListener) {this.mMessageListener=messageListener;}}

SmsInfo如下:

package cc.testsmslistener;public class SmsInfo {    //短信内容private String smsbody;//发送短信的电话号码private String phoneNumber;//发送短信时间private String date;//发送短信人的姓名private String name;//短信类型1是接收到的,2是已发出private String type;public String getSmsbody() {return smsbody;}public void setSmsbody(String smsbody) {this.smsbody = smsbody;}public String getPhoneNumber() {return phoneNumber;}public void setPhoneNumber(String phoneNumber) {this.phoneNumber = phoneNumber;}public String getDate() {return date;}public void setDate(String date) {this.date = date;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getType() {return type;}public void setType(String type) {this.type = type;}@Overridepublic String toString() {return "SmsInfo [smsbody=" + smsbody + ", phoneNumber=" + phoneNumber+ ", date=" + date + ", name=" + name + ", type=" + type + "]";}}

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"   >    <TextView        android:id="@+id/textView"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/hello_world"        android:layout_centerInParent="true"    /></RelativeLayout>


0 0