android 讀、寫、刪簡訊息

來源:互聯網
上載者:User

android接收和傳送簡訊
1.android傳送簡訊
                android API 中提供了smsManager類處理簡訊。其中的sendTextMessage(num, null, content, pend, null)函數就是發送
        簡訊的方法。第一個參數為目標者手機號、第二個參數為簡訊中心地址 null為預設地址、
        第三個參數簡訊的常值內容、第四個參數是一個intent會把發送結果帶回。第五個參數不知,一般為null。
                一個應用程式要具備傳送簡訊功能,需要在androidManifest.xml中加入android.permission.SEND_SMS許可權。
               
                在模擬器中發送中文會接收方出現亂碼的問題,但是在真機中,就不會出現亂碼的情況了。所以
        開發人員只需要正常開發簡訊功能,不需要編碼轉換。

接收簡訊也是比較方便的,主要是繼承BroadcaseReceiver 類 ,覆蓋onReceive 函數:
1:相關類:
android.content.BroadcastReceiver
android.telephony.gsm.SmsMessage;

2:example code.

public class MessageDemo extends BroadcastReceiver {
    private static final String strACT = "android.provider.Telephony.SMS_RECEIVED";
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(strACT)) {
StringBuilder sb = new StringBuilder();
Bundle bundle = intent.getExtras();
if (bundle != null) {
Object[] pdus = (Object[]) bundle.get("pdus");
SmsMessage[] msg = new SmsMessage[pdus.length];
for (int i = 0; i < pdus.length; i++) {
msg[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
}
for (SmsMessage currMsg : msg) {
sb.append("From:");
sb.append(currMsg.getDisplayOriginatingAddress());
sb.append("\nMessage:");
sb.append(currMsg.getDisplayMessageBody());
}
}
}

}
3: 相關的配置

修改AndroidManifest.xml,在Activity下添加receiver節點:
<receiver android:name="MessageDemo">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
隨後在application下添加節點:
<uses-permission android:name="android.permission.SEND_SMS"></uses-permission>
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>

4:使用BroadReceiver的弊端
查看BroadReceiver sdk reference , 可以瞭解到所有的BroadReceiver對簡訊的接收是無順序的狀態 ,即使是使用了Ordered broadcasts對於同等優先順序別的BroadReceiver ,也會產生無順序的行為。
所以下面介紹另一種接收簡訊的行為,包括其中可以進行簡訊的刪除。

5:從資料庫端監聽sms的收發
//如下 主要用於內部資料庫改變,向外面的介面(Activity)做反應
class SMSHandler extends Handler
{
    public void handleMessage(Message msg)
    {
        //Handle message
    }
}
// 對收到短訊息後,做出的處理,這裡直接刪除,並沒有反應到介面,所以上面的handleMessage是空的。
class SMSObserver extends ContentObserver
{
    private Handler m_handle = null;

    public SMSObserver(Handler handle)
    {
        super(handle);
        m_handle = handle;
    }
    public void onChange(boolean bSelfChange)
    {
        super.onChange(bSelfChange);

        //Send message to Activity
        Message msg = new Message();
        msg.obj = "xxxxxxxxxx";
        m_handle.sendMessage(msg);

String strUriInbox = "content://sms/inbox";
Uri uriSms = Uri.parse(strUriInbox);  //If you want to access all SMS, just replace the uri string to "content://sms/"
Cursor c = mContext.getContentResolver().query(uriSms, null, null, null, null);
// delete all sms here when every new sms occures.
while (c.moveToNext())
{   
       //Read the contents of the SMS;
       for(int i; i < c.getColumnCount(); i++)
        {
            String strColumnName = c.getColumnName(i);
            String strColumnValue = c.getString(i);
        }
       //Delete the SMS
        String pid = c.getString(1);  //Get thread id;
       String uri = "content://sms/conversations/" + pid;
       mContext.getContentResolver().delete(Uri.parse(uri), null, null);       
   
}
    }
}

//把基本類功能性地應用起來
ContentResolver contentResolver = getContentResolver();// Context 環境下getContentResolver()
Handler handler = new SMSHandler();
ContentObserver m_SMSObserver = new SMSObserver(handler);
contentResolver.registerContentObserver(Uri.parse("content://sms/inbox"),true, m_SMSObserver);
//Register to observe SMS in outbox,we can observe SMS in other location by changing Uri string, such as inbox, sent, draft, outbox, etc.)

// some Available Uri string  for sms.
/* 
  String strUriInbox = "content://sms/inbox";//SMS_INBOX:1
  String strUriFailed = "content://sms/failed";//SMS_FAILED:2
  String strUriQueued = "content://sms/queued";//SMS_QUEUED:3
  String strUriSent = "content://sms/sent";//SMS_SENT:4
  String strUriDraft = "content://sms/draft";//SMS_DRAFT:5
  String strUriOutbox = "content://sms/outbox";//SMS_OUTBOX:6
  String strUriUndelivered = "content://sms/undelivered";//SMS_UNDELIVERED
  String strUriAll = "content://sms/all";//SMS_ALL
  String strUriConversations = "content://sms/conversations";//you can delete one conversation by thread_id
  String strUriAll = "content://sms"//you can delete one message by _id
*/
REMEBER: must request following permission
1) Read SMS
    <uses-permssion android:name="android.permission.READ_SMS" />
2) Delete/Modify/Send SMS
    <uses-permssion android:name="android.permission.WRITE_SMS" />
in AndroidManifest.xml

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.