標籤:android blog http io sp for 資料 on 問題
公司要做一個【因為是機密所以不能說】的項目,有個需求是攔截手機系統的簡訊,而且不能在手機的簡訊應用上顯示。
OK,一開始以為不難,網上查了一下資料也發現有人做過,於是就開始寫demo,結果才發現,這尼瑪就是個大坑啊!!
首先網上查到的最多的實現方案是利用自訂的 BroadcastReceiver 去攔截"android.provider.Telephony.SMS_RECEIVED" 的廣播,看起來也不難,於是試了下。發現好坑爹啊!在我的酷派大神上無論怎麼樣就是攔截不到~
好吧,一定是我寫代碼的姿勢不對,所以又到網上查資料。
謔謔謔,我果然機智~~ 一下子就找到了!原來是我的優先順序不夠。
安卓的廣播是有優先順序的,並且動態註冊的廣播優先順序更高。於是參考網上說的,優先順序設到2147483647,又弄個動態註冊,然後興奮的用我的酷派再試一次——但還是不行!
詳見:http://www.apkbus.com/forum.php?mod=viewthread&tid=53053
鬱悶,難道是我手機的問題?好吧,拿一個同事的2.3安卓機試了一下,還真的可以。。。難道真是手機問題?不行,多拿幾台試一下。於是再拿其他同事的手機了一下,也跟我一樣。那麼大概就可以確定了,是手機系統版本不一樣,因為其他同事都是4.0以上的手機。
好吧雖然原因找到,但總得想辦法解決是吧?
網上關於攔截簡訊的資料雖然比較少,不過還是有提到其他的方法的。另一個方法就是監聽資料庫發生變化時去刪除簡訊的資料。也就是在插入新資訊的時候把新資訊刪了,這樣也算是攔截。
網上的資料是註冊一個內容提供者監聽"content://sms/" 的資料變化,按照他寫的代碼試了,還是可以監聽到資料庫變化的。
詳見:http://bingtian.iteye.com/blog/641566
但是,在4.0以上系統cursor居然是空的(2.3的手機沒問題)!
TUT好坑爹啊!到底毛回事啊!
好吧,耐心的我又想到另一個onChange(boolean selfChange, Uri uri),這個帶Uri參數的方法是高版本的安卓系統上才有的,所以我在這裡把uri列印了出來。結果發現列印出來的都是content://sms/910、content://sms/911之類的,根本就沒有content://sms/inbox。那麼也怪不得cursor是空的!
好吧,既然content://sms/inbox查不到,那我就查你給我的uri吧~
首先把該uri的欄位列印出來:
_id;thread_id;address;m_size;person;date;date_sent;protocol;read;status;type;reply_path_present;subject;body;service_center;locked;sim_id;error_code;seen;ipmsg_id;ref_id;total_len;rec_len;itemInfoid;receive_date;
再跟2.3系統的content://sms/inbox欄位對比一下:
_id;thread_id;address;person;date;sc_timestamp;protocol;read;status;type;reply_path_present;subject;body;service_center;locked;error_code;seen;lgeMsgType;lgeSiid;lgeCreated;lgeExpires;lgeReceived;lgeAction;lgeSec;lgeMac;lgeDoc;doInstalled;lgePinRemainCnt;index_on_icc;service_msg_sender_address;modified;modified_time;
有些欄位是不一樣的,不過一些主要的欄位如_id、address、body還是一樣的。
那麼要拿到簡訊的內容跟寄件者的號碼還是沒問題的,address就是寄件者號碼,body是簡訊內容。試了一下,可以拿到。
比較擔心的就是能不能刪除掉資料庫裡的這些簡訊,不過試了一下還是可以的~
就結果而言還不錯——成功的攔截到簡訊,並把簡訊刪掉了,系統雖然會“叮~”的一聲提醒來簡訊了,但是顯示的卻不是我剛發的簡訊,而是我上一次發的(剛發的已經被刪了)。
總結:既然不能在這棵樹上弔死,就多找幾課樹試試。
Android新姿勢:如何截取簡訊