国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Android開發(fā)之監(jiān)聽或獲取手機短信內(nèi)容

http://blog.csdn.net/mad1989/article/details/22426415

最近做的項目里要監(jiān)聽手機的短消息內(nèi)容,這個東西好像在最初學的時候都做過,不過現(xiàn)在早忘記了,現(xiàn)在寫下來,記住了。



前提--權限:


[java] view plaincopy


  1. <uses-permission android:name="android.permission.RECEIVE_SMS" >  
  2. </uses-permission>  
  3. <uses-permission android:name="android.permission.READ_SMS" >  
  4. </uses-permission>  



方式一:通過廣播監(jiān)聽短信消息

(注意:這種方式只對新收到的短消息有效,運行代碼,并不會讀取收件箱中已讀或未讀的消息,只有當收到新來的短消息時,才會執(zhí)行onChange方法)


注冊一個廣播:


[java] view plaincopy


  1. <receiver android:name="com.dbjtech.acbxt.waiqin.SmsReciver" >  
  2.            <intent-filter android:priority="999">  
  3.                <action android:name="android.provider.Telephony.SMS_RECEIVED" />  
  4.            </intent-filter>  
  5.        </receiver>  


SmsReceiver.java


[java] view plaincopy


  1. public class SmsReciver extends BroadcastReceiver {  
  2.   
  3.     @Override  
  4.     public void onReceive(Context context, Intent intent) {  
  5.         Bundle bundle = intent.getExtras();  
  6.         SmsMessage msg = null;  
  7.         if (null != bundle) {  
  8.             Object[] smsObj = (Object[]) bundle.get("pdus");  
  9.             for (Object object : smsObj) {  
  10.                 msg = SmsMessage.createFromPdu((byte[]) object);  
  11.             Date date = new Date(msg.getTimestampMillis());//時間  
  12.                 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  13.                 String receiveTime = format.format(date);  
  14.                 System.out.println("number:" + msg.getOriginatingAddress()  
  15.                 + "   body:" + msg.getDisplayMessageBody() + "  time:"  
  16.                         + msg.getTimestampMillis());  
  17.                   
  18.                 //在這里寫自己的邏輯  
  19.                 if (msg.getOriginatingAddress().equals("10086")) {  
  20.                     //TODO  
  21.                       
  22.                 }  
  23.                   
  24.             }  
  25.         }  
  26.     }  
  27.   
  28. }  




系統(tǒng)的這個廣播是有序廣播,就是當別的程序先獲取到了這個廣播再傳遞給你,當然它也可以干掉這個廣播,讓你接收不到,這樣你的程序肯定是接收不到這個廣播的了。我們發(fā)現(xiàn),通過設置priority的數(shù)值,其實有時是不管用的,現(xiàn)在在一些定制的系統(tǒng)或是有安全軟件的情況下,往往短消息都被截取到,并被干掉。

那么,我們只能使用方法二,監(jiān)聽短信數(shù)據(jù)庫的變化,這種方式比方法一稍微復雜一些,不過使用起來也很方便,不受其它程序干擾~


方式二:通過短信數(shù)據(jù)庫獲取短信內(nèi)容

(注意:這種方式可以獲取手機上所有的短信,包括已讀未讀的短信,是不是很贊)


[java] view plaincopy


  1. private Uri SMS_INBOX = Uri.parse("content://sms/");  
  2.     public void getSmsFromPhone() {  
  3.         ContentResolver cr = getContentResolver();  
  4.         String[] projection = new String[] { "body" };//"_id", "address", "person",, "date", "type  
  5.         String where = " address = '1066321332' AND date >  "  
  6.                 + (System.currentTimeMillis() - 10 * 60 * 1000);  
  7.         Cursor cur = cr.query(SMS_INBOX, projection, where, null, "date desc");  
  8.         if (null == cur)  
  9.             return;  
  10.         if (cur.moveToNext()) {  
  11.             String number = cur.getString(cur.getColumnIndex("address"));//手機號  
  12.             String name = cur.getString(cur.getColumnIndex("person"));//聯(lián)系人姓名列表  
  13.             String body = cur.getString(cur.getColumnIndex("body"));  
  14.             //這里我是要獲取自己短信服務號碼中的驗證碼~~  
  15.             Pattern pattern = Pattern.compile(" [a-zA-Z0-9]{10}");  
  16.             Matcher matcher = pattern.matcher(body);  
  17.             if (matcher.find()) {  
  18.                 String res = matcher.group().substring(1, 11);  
  19.                 mobileText.setText(res);  
  20.             }  
  21.         }  
  22.     }  






sms主要結(jié)構:

  

  _id:短信序號,如100

  

  thread_id:對話的序號,如100,與同一個手機號互發(fā)的短信,其序號是相同的

  

  address:發(fā)件人地址,即手機號,如+86138138000

  

  person:發(fā)件人,如果發(fā)件人在通訊錄中則為具體姓名,陌生人為null

  

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

  

  protocol:協(xié)議0SMS_RPOTO短信,1MMS_PROTO彩信

  

  read:是否閱讀0未讀,1已讀

  

  status:短信狀態(tài)-1接收,0complete,64pending,128failed

  

  type:短信類型1是接收到的,2是已發(fā)出

  

  body:短信具體內(nèi)容

  

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



通過方式二,我們就能獲取手機中所有的短消息了,可是還有一個問題,如果來了新的短消息呢?我們總不能寫個線程,每隔多少秒,去讀取一下短信數(shù)據(jù)庫吧?其實我們可以把方式二換個方式寫:


[java] view plaincopy


  1. private SmsObserver smsObserver;  
  2.   
  3.     protected void onCreate(Bundle savedInstanceState) {  
  4.         super.onCreate(savedInstanceState);  
  5.         setContentView(R.layout.app_login);  
  6.         smsObserver = new SmsObserver(this, smsHandler);  
  7.         getContentResolver().registerContentObserver(SMS_INBOX, true,  
  8.                 smsObserver);  
  9.   
  10.     }  
  11.     public Handler smsHandler = new Handler() {  
  12.         //這里可以進行回調(diào)的操作  
  13.         //TODO  
  14.   
  15.     };  
  16.     class SmsObserver extends ContentObserver {  
  17.   
  18.         public SmsObserver(Context context, Handler handler) {  
  19.             super(handler);  
  20.         }  
  21.   
  22.         @Override  
  23.         public void onChange(boolean selfChange) {  
  24.             super.onChange(selfChange);  
  25.             //每當有新短信到來時,使用我們獲取短消息的方法  
  26.             getSmsFromPhone();  
  27.         }  
  28.     }  






效果:


本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
android 短信接受學習 - 熊貓眼 - JavaEye技術網(wǎng)站
android如何監(jiān)聽發(fā)送短信?
Android中內(nèi)容觀察者的使用---- ContentObserver類詳解 (轉(zhuǎn))
【技術】Android自動填充短信驗證碼
獲取Android手機中所有的短信
Android: 讀取短信
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服