Android之傳送簡訊和接收驗證碼

來源:互聯網
上載者:User

標籤:

最近項目需求需要傳送簡訊和接收驗證碼並將驗證碼顯示在輸入框中 以下是我的記錄    前提---許可權   <uses-permission android:name="android.permission.SEND_SMS"></uses-permission><uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission> <uses-permission android:name="android.permission.READ_SMS"></uses-permission>   1.  傳送簡訊並提示是否發送成功以及對方是否接收 package com.javen.utils;import java.util.ArrayList;import android.app.Activity;import android.app.PendingIntent;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.telephony.SmsManager;import android.widget.Toast;/** * @author Javen * */public class SendMessageUtil {    /** 發送與接收的廣播 **/    private static String SENT_SMS_ACTION = "SENT_SMS_ACTION";    private static String DELIVERED_SMS_ACTION = "DELIVERED_SMS_ACTION";    /**     * 實現傳送簡訊     * @param context      * @param text 簡訊的內容     * @param phoneNumber 手機號碼     */    public static void sendMessage(Context context, String text,            String phoneNumber) {        context.registerReceiver(sendMessage, new IntentFilter(SENT_SMS_ACTION));        context.registerReceiver(receiver, new IntentFilter(                DELIVERED_SMS_ACTION));                // create the sentIntent parameter          Intent sentIntent = new Intent(SENT_SMS_ACTION);          PendingIntent sentPI = PendingIntent.getBroadcast(context, 0, sentIntent,0);        // create the deilverIntent parameter          Intent deliverIntent = new Intent(DELIVERED_SMS_ACTION);          PendingIntent deliverPI = PendingIntent.getBroadcast(context, 0,deliverIntent, 0);                 SmsManager smsManager = SmsManager.getDefault();        //如果字數超過5,需拆分成多條簡訊發送        if (text.length() > 70 ) {            ArrayList<String> msgs = smsManager.divideMessage(text);            for (String msg : msgs) {                smsManager.sendTextMessage(phoneNumber, null, msg, sentPI, deliverPI);                                    }        } else {            smsManager.sendTextMessage(phoneNumber, null, text, sentPI, deliverPI);        }    }    private static BroadcastReceiver sendMessage = new BroadcastReceiver() {        @Override        public void onReceive(Context context, Intent intent) {            // 判斷簡訊是否發送成功            switch (getResultCode()) {            case Activity.RESULT_OK:                Toast.makeText(context, "簡訊發送成功", Toast.LENGTH_SHORT).show();                break;            default:                Toast.makeText(context, "發送失敗", Toast.LENGTH_LONG).show();                break;            }        }    };    private static BroadcastReceiver receiver = new BroadcastReceiver() {        @Override        public void onReceive(Context context, Intent intent) {            // 表示對方成功收到簡訊            Toast.makeText(context, "對方接收成功", Toast.LENGTH_LONG).show();        }    };}
2.通過簡訊資料庫擷取簡訊內容package com.example.message;import java.util.regex.Matcher;import java.util.regex.Pattern;import android.app.Activity;import android.content.ContentResolver;import android.content.Context;import android.database.ContentObserver;import android.database.Cursor;import android.net.Uri;import android.os.Bundle;import android.os.Handler;import android.widget.Toast;public class MainActivity extends Activity { private SmsObserver smsObserver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); smsObserver = new SmsObserver(this, smsHandler); getContentResolver().registerContentObserver(SMS_INBOX, true,smsObserver); } public Handler smsHandler = new Handler() { // 這裡可以進行回調的操作 // TODO public void handleMessage(android.os.Message msg) { System.out.println("smsHandler 執行了....."); }; }; private Uri SMS_INBOX = Uri.parse("content://sms/"); public void getSmsFromPhone() { ContentResolver cr = getContentResolver(); String[] projection = new String[] { "body","address","person"};// "_id", "address", // "person",, "date", // "type String where = " date > " + (System.currentTimeMillis() - 10 * 60 * 1000); Cursor cur = cr.query(SMS_INBOX, projection, where, null, "date desc"); if (null == cur) return; if (cur.moveToNext()) { String number = cur.getString(cur.getColumnIndex("address"));// 手機號 String name = cur.getString(cur.getColumnIndex("person"));// 連絡人姓名列表 String body = cur.getString(cur.getColumnIndex("body")); System.out.println(">>>>>>>>>>>>>>>>手機號:" + number); System.out.println(">>>>>>>>>>>>>>>>連絡人姓名列表:" + name); System.out.println(">>>>>>>>>>>>>>>>簡訊的內容:" + body); // 這裡我是要擷取自己簡訊服務號碼中的驗證碼~~ Pattern pattern = Pattern.compile("[a-zA-Z0-9]{5}"); Matcher matcher = pattern.matcher(body);//String body="測實驗證碼2346ds"; if (matcher.find()) { String res = matcher.group().substring(0, 5);// 擷取簡訊的內容 showToast(res); System.out.println(res); } } } protected void showToast(String text) { Toast.makeText(MainActivity.this, text, Toast.LENGTH_LONG).show(); } class SmsObserver extends ContentObserver { public SmsObserver(Context context, Handler handler) { super(handler); } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); // 每當有新簡訊到來時,使用我們擷取短訊息的方法 getSmsFromPhone(); } }} 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 詳細的資料庫檔案如下:

簡訊資料庫分析

 

表結構分析:

address:簡訊寄件者電話號碼

person:連絡人編號,如果電話薄裡有連絡人則顯示編號,沒有連絡人則顯示null

read:讀取狀態,0為未讀,1為已讀

body:簡訊內容

 

thread表:線程表

 

dataL:日期

message_count:簡訊發送的條數

snippet:最後一條簡訊內容

read:簡訊讀取狀態

 

 

Android之傳送簡訊和接收驗證碼

聯繫我們

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