如何让Android自动接受新短信并通过Gmail发送

肉壳有一部安德猴手机,因为喜新厌旧,去年换成了iPhone……虽然换了新手机,觉得很厉害,但是,旧手机既然还能用,就要让他继续发挥余热。于是肉壳把自己不常用的天津手机卡放在了这个手机里……因为这个号码是肉壳第一个手机号,所以,很多验证码都是绑定在这个手机的,所以,有些时候,需要验证码的时候,这个手机又没有带在身上,是一件非常令人苦恼的事情。所以本着自己动手丰衣足食的原则,自己写了个小android程序,帮助自己把接收到的新短信,自动用Gmail发送给一个预设邮箱……

在完成这件任务之前,你需要做一件事,就是安装一个修改过权限的Gmail客户端,因为原版Gmail有个Auto Send权限,但是,类型是signature。也就是说,这个权限只能由系统或者应用本身调用,也就是说,作为第三方的我们是无法调用的,所以大家可以看看这个帖子,学习一下,如何将signature权限修改为normal权限,这里就不再赘述了,因为肉壳也是直接从论坛里下载下来的。

然后,如果你用的是MIUI,你还需要做一件事,跟我一起做,设置->小米云服务->免费网络短信->高级设置->系统短信优先,把这个系统短信优先关掉,因为这个设置会拦截所有android系统内部的SMS Receiver,导致我们的程序不能实时检测到新短信。

接下来,我们就可以开始了……

首先,AndroidManifest.xml, 我们要添加收取短信的权限和Gmail的Auto Send权限……

// 添加收取短信的权限和Gmail的Auto Send权限
 

之后,我们一步一步来,先做拦截新短信的功能。

所以继续编辑AndroidManifest.xml,我们要写一个Receiver。

// 在AndroidManifest.xml中声明一个Receiver

	
		
	

然后,我们就可以新建一个类,比如“SMSBroadcastReceiver“,内容大概是

// SMSBroadcastReceiver 继承了BroadcastReceiver,所以这不是一个Activity
public class SMSBroadcastReceiver extends BroadcastReceiver {
	public static final String ACTION = "android.provider.Telephony.SMS_RECEIVED"; 
	@Override
	public void onReceive(Context context, Intent intent) {
		if (intent.getAction().equals(ACTION)) {
			StringBuffer SMSAddress = new StringBuffer();
			StringBuffer SMSContent = new StringBuffer();
			Bundle bundle = intent.getExtras();
			if (bundle != null) {
				Object[] pdusObjects = (Object[]) bundle.get("pdus");
				SmsMessage[] messages = new SmsMessage[pdusObjects.length];
				for (int i = 0; i < pdusObjects.length; i++) {
					messages[i] = SmsMessage.createFromPdu((byte[]) pdusObjects[i]);
				}
				for (SmsMessage message : messages) {
					SMSAddress.append(message.getDisplayOriginatingAddress());
					SMSContent.append(message.getDisplayMessageBody());
				}
			}
			System.out.println(SMSAddress.toString()+" said:\""+SMSContent+"\"");
		}             
	}
}

这样子,我们就可以在收到新短信的时候,获取到短信内容了,大家可以试试给虚拟机塞一条信息,或者给真机发条短信试试……

搞定短信接收问题之后,下一步就是用Gmail来发送邮件,其实,可以用系统自带的Mail来发邮件,但是需要手动按发送才可以将内容发送出去。虽说可以通过一些包或者一些复杂的手段实现自动发送,可是还是觉得略麻烦……所以我们用修改过的Gmail附带的AUTO SEND权限就好了……用法也非常简单……直接看代码……

// 调用Gmail的AUTO SEND Activity
Intent intentSend = new Intent("com.google.android.gm.action.AUTO_SEND");  
intentSend.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 由于Receiver不是Activity,所以在后面开始一个Activity前,要给intent设置FLAG_ACTIVITY_NEW_TASK这个FLAG
intentSend.setType("plain/text"); 
String[] reciver = new String[] { "xx@xxxxxx.com" }; // 收件人邮箱,应该可以是多人,我没有尝试
intentSend.putExtra(android.content.Intent.EXTRA_EMAIL, reciver);  
intentSend.putExtra(android.content.Intent.EXTRA_SUBJECT, SMSAddress.toString());  
intentSend.putExtra(android.content.Intent.EXTRA_TEXT, SMSContent.toString()); 
context.startActivity(intentSend);

至此,这个应用就完成了,测试了一下,一切OK,以后再需要收验证码,只要上我的邮箱就好咯……以后有时间还可以做一个回复邮件自动发短信的功能,而且,最好能脱离Gmail的限制。其实也不难的,有时间再说吧,这个应急就行……

代码我放在Github(https://github.com/Rokeer/MailMySMS)上了,大家可以自己去看看……写的很水,连界面都没有做……

大概就是这样……

Gmail的优先收件箱

前两天跟农药讨论有关机器人情感的问题。我提出了一个想法,如果想让机器人与人类拥有同样的感情,机器人必须学会像人类一样去学习。不仅仅利用理性,还要使用感性。当然,世界上很多科学家也都在研究这样的问题,只是他们的研究应该比我们的讨论深层次的多。

如何让计算机学习呢,我们能看到许多先人的例子。比如Last.fm和豆瓣,他们都可以学习并猜测你会喜欢什么样的音乐、电影和书籍。但是这种学习我觉得是一种逻辑的、理性的学习,你告诉计算机你喜欢么,计算机再分析跟你有同样喜好的人还喜欢其他什么东西,于是整理出答案。这样的学习虽然不会让计算机产生感情,但它们确实可以帮助人类找到我们自己更加需要的东西。

什么是优先收件箱?

今天早上起来,习惯性的检查一下邮箱,发现Gmail现在提供一项beta服务,优先收件箱。这个功能可以帮助用户筛选出用户可能认为重要的邮件。试用后,在侧边栏会出现一个“优先收件箱”的选项,如果想恢复普通的收件箱,点击那个“收件箱”按钮即可。当然,你也可以在设置中永久切换回普通收件箱。

这个东西是如何工作的?

“Gmail 的服务器会检查几种类型的信息来识别对您来说很重要的电子邮件,包括您最常向其发送电子邮件和与之聊天的人、您与这些人电子邮件往来的频率,以及在您阅读的电子邮件中经常出现的关键字。”

它如何知道什么邮件对我们是重要的?

就像我刚才说到的,计算机需要学习,才能知道我们需要看到什么样的邮件。“如果优先收件箱判断出现失误,您可以使用 Mark not important 按钮准确地将会话标记为“重要”或“不重要”,这样优先收件箱就会快速了解您最关注哪些内容。”

如何使用它呢?

点击试用后,系统会要求用后简单设置几封邮件的优先级。设置之后,优先收件箱里的邮件会按这样的顺序依次排开。“重要邮件”——加星邮件——普通邮件。我们可以先回复优先邮件,然后对需要跟踪的邮件加星,最后再回复普通邮件。

当然,计算机都是笨蛋,它不可能永远准确的找到对我们来说重要的邮件。那如何保证一些重要邮件不会被丢掉呢?我们可以设置过滤器,然后选择“始终将其标记为重要”。另外,如果我们想想查看标记为“重要”的所有邮件(包括已读和未读邮件),可在 Gmail 中搜索“is:important”。

最近Gmail对自身的改动真的很大,显示更改了Gmail的界面,又在Gtalk中加入Google Voice功能,现在又增加了这个优先收件箱功能。不知道在未来的一段时间内,还会有什么新的功能没有。令人期待……

最后,给大家一个GFW unfriendly的视频。来自Youtube,如果能翻墙就看看,不能就算了。是Gmail有关优先收件箱的介绍视频。