Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android開發之監聽發出的短信

Android開發之監聽發出的短信

編輯:關於Android編程

運行效果圖:

\\

預備知識:

為了監聽指定的ContentProvider的數據的改變,需要通過ContentResolver向指定Uri注冊CotentObserver監聽器。ContentResolver提供了如下方法來注冊監聽器:

publicfinal void registerContentObserver(Uriuri, boolean notifyFZ喎?/kf/ware/vc/" target="_blank" class="keylink">vckRlc2NlbmRlbnRzLCBDb250ZW50T2JzZXJ2ZXIgb2JzZXJ2ZXIpCjwvcD4KPHA+ICCyzsr9o7p1cmkgOrjDvODM/cb3y/m84Mz9tcRDb250ZW50UHJvdmlkZXK1xFVyaaGjPC9wPgo8cD4gICAgICAgICBub3RpZnlGb3JEZXNjZW5kZW50cyCjus6qZmFsc2Ugse3Kvr6ryLfGpcXko6y8tNa7xqXF5LjDVXJpLM6qdHJ1ZSCx7cq+v8nS1M2syrHGpcXkxuTFycn6tcRVcmmhozwvcD4KPHA+ICAgICAgICAgIG9ic2VydmVyo7pDb250ZW50T2JzZXJ2ZXLFycn6tcS84Mz9xvfKtcD9oaM8L3A+CjxwPjxzdHJvbmc+IMihz/vXorLhvODM/cb3o7o8L3N0cm9uZz48L3A+CjxwPiAgICBwdWJsaWMgZmluYWx2b2lkICB1bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKENvbnRlbnRPYnNlcnZlciBvYnNlcnZlcik8L3A+CjxwPiAgICAguabE3KO6yKHP+7bUuPi2qFVyabXEuduy7DwvcD4KPHA+ss7K/aO6IG9ic2VydmVyIENvbnRlbnRPYnNlcnZlcrXExcnJ+sDgyrXA/aGjIDwvcD4KPHA+ICAgICAgICBDb250ZW50T2JzZXJ2ZXKhqqGqxNrI3bnbsuzV36OsxL+1xMrHuduy7Ciytte9KczYtqhVcmnS/cbwtcTK/b7dv+K1xLHku6+jrLzMtvjX9tK70KnP4NOmtcS0psDto6zL/MDgJiMyMDI4NDvT2sr9vt2/4ry8yvXW0LXEtKW3osb3KFRyaWdnZXIpo6y1sUNvbnRlbnRPYnNlcnZlcsv5uduy7LXEVXJpt6LJ+rHku6/KsaOsseO74bSlt6LL/KGjtKW3osb3t9bOqrHttKW3osb3oaLQ0LSlt6LG96Osz+DTprXYQ29udGVudE9ic2VydmVy0rK31s6qobCx7aGwQ29udGVudE9ic2VydmVyoaKhsNDQobFDb250ZW50T2JzZXJ2ZXKjrLWxyLvV4srH0+vL/Mv5vODM/bXEVXJpIE1JTUUgVHlwZdPQPC9wPgo8cD4gudi1xKGjICAgICAgICAgPC9wPgo8aDE+PHN0cm9uZz5Db250ZW50T2JzZXJ2ZXLA4L3pydyjujwvc3Ryb25nPjwvaDE+CjxwPr3TytW72LX3tcS4/LjExNrI3aGjsdjQ69PJsbvM7bzTtb3Su7j2Q29udGVudE9ic2VydmFibGW21M/zyrXP1qGjPC9wPgo8aDI+PHN0cm9uZz4gubnU7Le9t6ijujwvc3Ryb25nPjwvaDI+Cjx0YWJsZSBib3JkZXI9"0" cellspacing="0" cellpadding="0" width="560">

Public Constructors

ContentObserver(Handler handler)

onChange() will happen on the provider Handler.

說明:所有 ContentObserver的派生類都需要調用該構造方法

參數:handler  Handler對象。可以是主線程Handler(這時候可以更新UI 了),也可以是任何Handler對象。

常用方法:

Public Methods

boolean

deliverSelfNotifications()

Returns true if this observer is interested in notifications for changes made through the cursor the observer is registered with.

final void

dispatchChange(boolean selfChange)

void

onChange(boolean selfChange)

This method is called when a change occurs to the cursor that is being observed.

說明:

void onChange(booleanselfChange)

功能:當觀察到的Uri發生變化時,回調該方法去處理。所有ContentObserver的派生類都需要重載該方法去處理邏輯。

參數:selfChange 回調後,其值一般為false,該參數意義不大(我也不懂,理解方法最重要)。

觀察特定Uri的步驟如下:

1、 創建我們特定的ContentObserver派生類,必須重載父類構造方法,必須重載onChange()方法去處理回調後的功能實現

2、 利用context.getContentResolover()獲得ContentResolove對象,接著調用registerContentObserver()方法去注冊內容觀察者

如://為content://sms的數據改變注冊監聽器getContentResolver().registerContentObserver(Uri.parse

("content://sms"), true, new SmsObserver(new Handler()));

3、 由於ContentObserver的生命周期不同步於Activity和Service等,因此,在不需要時,需要手動的調用unregisterContentObserver()去取消注冊。


短信相關權限:








相關的協議:

content://sms/inbox 收件箱
content://sms/sent 已發送
content://sms/draft 草稿
content://sms/outbox 發件箱
content://sms/failed 發送失敗
content://sms/queued 待發送列表

數據庫中sms相關的字段及說明:


字段

說明

_id

短信序號,如100

  thread_id

對話的序號,如100,與同一個手機號互發的短信,其序號是相同的  

  address

發件人地址,即手機號,如+86138138000  

  person

發件人,如果發件人在通訊錄中則為具體姓名,陌生人為null  

  date

日期,long型,如1346988516,可以對日期顯示格式進行設置  

  protocol

協議0SMS_RPOTO短信,1MMS_PROTO彩信  

  read

是否閱讀0未讀,1已讀  

  status

短信狀態-1接收,0complete,64pending,128failed  

  type

短信類型1是接收到的,2是已發出  

  body

短信具體內容

  service_center

短信服務中心號碼編號,如+8613800755500

應用實例:

package com.jph.monitorsms;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;
import android.widget.Toast;
import android.app.Activity;
import android.database.ContentObserver;
import android.database.Cursor;
/**
 * Describe:
* 獲取用戶正在發送的短信 * 本實例通過為content://sms的數據改變注冊監聽器來 * 獲取手機正在發送的消息。 * @author JPH * Date:2014.07.20 * */ public class MonitorSms extends Activity { TextView txtView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); txtView=(TextView)findViewById(R.id.txtView); //為content://sms的數據改變注冊監聽器 getContentResolver().registerContentObserver(Uri.parse ("content://sms"), true, new SmsObserver(new Handler())); } //一個繼承自ContentObserver的監聽器類 class SmsObserver extends ContentObserver{ public SmsObserver(Handler handler) { super(handler); // TODO Auto-generated constructor stub } @Override public void onChange(boolean selfChange) { // TODO Auto-generated method stub //查詢發送向箱中的短信 Cursor cursor=getContentResolver().query(Uri.parse( "content://sms/outbox"), null, null, null, null); //遍歷查詢結果獲取用戶正在發送的短信 while (cursor.moveToNext()) { StringBuffer sb=new StringBuffer(); //獲取短信的發送地址 sb.append("發送地址:"+cursor.getString(cursor.getColumnIndex("address"))); //獲取短信的標題 sb.append("\n標題:"+cursor.getString(cursor.getColumnIndex("subject"))); //獲取短信的內容 sb.append("\n內容:"+cursor.getString(cursor.getColumnIndex("body"))); //獲取短信的發送時間 Date date=new Date(cursor.getLong(cursor.getColumnIndex("date"))); //格式化以秒為單位的日期 SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 hh時mm分ss秒"); sb.append("\n時間:"+sdf.format(date)); System.out.println("查詢到的正在發送的短信:"+sb.toString()); Toast.makeText(MonitorSms.this, sb.toString(), Toast.LENGTH_LONG).show(); txtView.setText(sb.toString()); } super.onChange(selfChange); } } }



  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved