手機有新簡訊了,通過電腦提醒我,手機簡訊電腦
一般我使用手機的時間比較少,用電腦的時間比較多,手機輕度使用者,電腦就是重度了,上班或者下班回家後基本都是在用電腦,所以常常會有手機不在手邊或者正在充電的情況,聽歌正嗨著手機來電話或者來簡訊了基本很少會察覺到,來電話還好說簡訊就震動一回,等你去用手機的時候可能已經過了很久了,我想如果手機有簡訊來了能直接通過電腦告訴我不就好了,這樣就不會錯過,所以我想要手機有新簡訊了就在電腦上提醒我這麼個功能。
接著查查有沒有這類軟體,發現有那麼幾個可以實現這個需求,但是功能有點多,是一個軟體裡面的其中一個功能。
最後還是決定自己寫個功能吧,一個是因為我還是喜歡功能簡單一點的,第二是讀取簡訊這個功能還是比較危險的,對別人的軟體不放心那自己寫的總信得過了吧,至少裡面有什麼自己是知道的。
最後的功能實現後的情況是手機有新的簡訊了,就在我的筆記本裡彈個視窗告訴我就行。
想了想實現的流程應該是手機上有個程式,要實現收到簡訊的功能和收到簡訊後要把簡訊內容和發信人往我的電腦發送,電腦收到後,右下角彈個窗。這樣就行了。
實現前提是,行動電話通訊和電腦網路處於同一網路中
大致流程圖
一步一步來做,彈窗功能很好弄,就是一個Winform程式,上面兩個標籤,一個標題一個內容,之前已經有了,可以直接用,啟動的時候傳兩個參數過去就會顯示你傳來的內容了。
然後就是手機怎麼往電腦發訊息,實現方法也很多,用TCP或者UDP,自己寫個程式在電腦上監聽連接埠,手機APP就直接往那裡發。
不過自己寫的話工作量也不少,我還是喜歡拿來就用的,現在的系統一般都內建IIS伺服器,而且還開機自動啟動,對自己來說幾乎是不用專門去管的狀態。這樣的話就直接在IIS上建立一個網站,寫個動態網頁面,有請求的時候就開啟彈窗程式就可以了,手機APP可以直接把資料往這個頁面上POST,頁面再開啟彈窗程式,我感覺很OK。
然後就是手機端APP的問題,APP怎麼收到簡訊,然後怎麼往電腦上POST資料。
android系統裡有個簡訊廣播的功能,當有新的簡訊來的時候會發出一個廣播,可以自己寫個簡訊廣播接收器,有新簡訊的時候系統會調用你的廣播接收者,然後就能拿到簡訊內容,接著就可以把內容用http功能往電腦上發了,這樣總的流程就是下面這樣了。
就按照這個思路做,踩了不少坑,接下來上些關鍵區段代碼
1,建立個安卓項目
設定擷取相關的許可權
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.READ_SMS" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
建立簡訊廣播接收器
<receiver android:name=".Smsrecever"> <intent-filter android:priority="1000"> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver>
擷取簡訊內容及發送到電腦
public class Smsrecever extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { final String url = DataHelper.GetUrl(context); if ("".equals(url)) { return; } Bundle bundle = intent.getExtras(); Object[] objects = (Object[]) bundle.get("pdus"); for (Object obj : objects) { SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) obj); //擷取簡訊的內容 final String body = smsMessage.getDisplayMessageBody(); //擷取簡訊的發送人 final String address = smsMessage.getDisplayOriginatingAddress(); //擷取簡訊的時間 long date = smsMessage.getTimestampMillis(); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); format.setTimeZone(TimeZone.getTimeZone("GMT+8")); final String dateStr = format.format(date); new Thread(new Runnable() { @Override public void run() { common.SendMsg(url, address, body + " [" + dateStr + "]"); } }).start(); } }}
2,建立WEB網站進行接收簡訊內容
添加一個aspx頁面
public partial class showmsg : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { //接受標題及內容參數 string mm = HttpUtility.UrlEncode(Request["t"]) + " " + HttpUtility.UrlEncode(Request["b"]); //開啟exe程式 _ProcessUtil.CreateProcessAsUser(@"E:\codeProjects\Projects\showmsg\msg\bin\Debug\msg.exe", mm, _ProcessUtil._SESSION_TYPE.SessionFromActiveConsoleSessionId); Response.Write("1"); } }
微軟在vista系統後搞了個session隔離的機制,IIS是後台服務,屬於Session 0層級的,不同session之間不能通過視窗互發訊息,所以使用在C#裡的System.Diagnostics.Process.Start直接調用EXE的話你是看不到介面的。
查了下解決方案,可調用一個系統的API方法CreateProcessAsUser來建立進程即可。
最後完善後效果APP介面是這樣
彈窗程式