Android簡訊監聽(二)——利用ContentObserver實現簡訊監聽

來源:互聯網
上載者:User

標籤: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>


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.