首页 > 代码库 > 手机有新短信了,通过电脑提醒我

手机有新短信了,通过电脑提醒我

一般我使用手机的时间比较少,用电脑的时间比较多,手机轻度使用者,电脑就是重度了,上班或者下班回家后基本都是在用电脑,所以常常会有手机不在手边或者正在充电的情况,听歌正嗨着手机来电话或者来短信了基本很少会察觉到,来电话还好说短信就震动一回,等你去用手机的时候可能已经过了很久了,我想如果手机有短信来了能直接通过电脑告诉我不就好了,这样就不会错过,所以我想要手机有新短信了就在电脑上提醒我这么个功能。

接着查查有没有这类软件,发现有那么几个可以实现这个需求,但是功能有点多,是一个软件里面的其中一个功能。

最后还是决定自己写个功能吧,一个是因为我还是喜欢功能简单一点的,第二是读取短信这个功能还是比较危险的,对别人的软件不放心那自己写的总信得过了吧,至少里面有什么自己是知道的。

最后的功能实现后的情况是手机有新的短信了,就在我的笔记本里弹个窗口告诉我就行。

想了想实现的流程应该是手机上有个程序,要实现收到短信的功能和收到短信后要把短信内容和发信人往我的电脑发送,电脑收到后,右下角弹个窗。这样就行了。

实现前提是,手机网络和电脑网络处于同一网络中

大致流程图

技术分享

 

一步一步来做,弹窗功能很好弄,就是一个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界面是这样

技术分享

 

 

弹窗程序

技术分享

手机有新短信了,通过电脑提醒我