標籤:des android style blog class code
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>