如何让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)上了,大家可以自己去看看……写的很水,连界面都没有做……

大概就是这样……

如何检查端口占用情况

最近在给学生们做Demo的时候,遇到了一个端口占用的问题……既然知道问题的所在,就要开始尝试解决问题,检查出到底是哪个程序在使用这个端口,然后干掉它……

再Windows下,加入我的端口 3318被占用了,那么在cmd里执行

netstat -aon|findstr “3318”

得到结果如下

TCP    127.0.0.1:3318     127.0.0.1:3319     ESTABLISHED     2116
TCP    127.0.0.1:3319     127.0.0.1:3318     ESTABLISHED     2116

我们可以看到3318这个端口正在被pid为2116的程序占用,于是继续执行

tasklist|findstr “2116”

得到结果

firefox.exe      2116      Console      0      65,956 K

这样,我们就知道是firefox在占用这个端口了……但是奇怪的是,当我关掉firefox再重启,它也不会再继续占用我原来的端口了……可能是因为firefox会随机占用一下,所以导致我原来想使用的端口被占用吧……这不巧了么这不是啊?

然后,因为菜狗肉壳最近买了一台mac,所以考虑到mac也会出现这种情况,该怎么办呢?

mac下相对比较简单,只需要一条命令

lsof -i -n | grep 3318

这样就可以看到哪个程序占用了这些端口,就是这样……

继续发放大量Civitas邀请码

之前刚开始玩的时候,因为手头只有少量邀请码,所以只能发放一个……

经过不到两个月的努力,本人手里已经聚集了10余个Civitas邀请码,希望有志向相投的朋友一起努力,在Civitas的世界里打出一番天下。

再简单介绍一下什么是Civitas吧,Civitas(http://civitas.soobb.com)是一款模拟古代社会的网页游戏,游戏里没有任何NPC,所有事件都是由游戏里面的玩家所决定的。换句话说,这游戏就是一个真的社会,如果玩家数组够多的话,用来做社会研究也不为过。是不是觉得高端洋气上档次?

这是一个没有结局的游戏,也是一个有多样结局的游戏,结局如何,完全取决于你自己。跟我们踏浪寻星社一起踏足这片土地吧!

只要留下你的邮箱,我会尽快回复你一个邀请码!

发一个Civitas的邀请码

最近迷上一个游戏,由搜比网开发的网页游戏Civitas(http://civitas.soobb.com)……

首先说一下,写这篇文章,肉壳没有任何收入的,纯粹是因为觉得这个游戏很有意思,而且,实际上,如果真的严格的讲,这都不算是一个游戏……

Civitas玩起来感觉有点像以前的江湖,模拟的是古代社会,但是这有游戏为了防止玩家过于快速的升级,对玩家的行为作了许多限制,而且,最重要的是,这个游戏里没有任何NPC的存在,所有的行为全都是有真人玩家决定的。所以在这个系统里,就像是在一个真实的社会生活一样。按照开发者的说法,这个游戏会永久免费,而且没有任何收费道具,游戏赚钱只靠广告和玩家捐款,所以目前来看,还是比较良心的,不会存在人民币玩家的情况。另外,据说开小号的行为是不允许的,为了维护这个系统里的社会平衡,所以肉壳也没有尝试去开小号。

在经过10天的努力,肉壳终于4级了,获得了一个免费邀请码,如果有朋友想要就拿去吧,留下自己的邮箱,只有一个,先到先得……我在亚历山大,未来有可能会移民……

纪念老熊猫-熊光朴老先生

前几天听朋友说,老熊猫去世了,一直到刚刚才想起来,查了一下,老熊猫于2012年5月26日因病逝世。

可能在我博客的读者,大多数人都不知道谁是老熊猫,而本人虽与老熊猫素未谋面,但老熊猫可以说是对我个人影响极大的一位老先生。

那是我上初中的时候了,大概也就是03年,或者04年的时候,那个时候,因为经常听父亲从国外购买的5张外国歌曲精选CD而喜欢上了Paul Anka。那个时候,家里刚装上了宽带,除了打游戏,上黄网,剩下的时间就是喜欢在网上搜索Paul Anka的照片和事迹。那个时候英文不大好,所以只能找中文资料,于是,我发现了老熊猫音乐论坛。

那个时候,因为没有听过太多中文流行歌曲,所以对个人的音乐喜好并没有什么过多的定向,只是知道,那5张CD里面的歌曲都很好听,尤其有很多首都是Paul Anka的作品。老熊猫音乐论坛让我找到了很多同好,我爱上了这个网站,因为,每当我跟我同学说起Paul Anka的时候,没有人知道那是什么,而我在这个论坛谈起他,却可以得到很多人的相应。而这个论坛里的人,大多是爵士乐以及轻音乐的爱好者,我爱上了这个论坛。

说到这里,大家应该也知道了,老熊猫就是这个网站的创办人,他曾在80年代留洋美国,收集了大量40年代左右的唱片及资料,在回国的时候,他把这些资料运回国内,并进行整理。为了能够使这些资料方便储存和查询,老熊猫将这些资料录入计算机并创立了老熊猫音乐网。虽然这个网站已经不复存在了,但是这个网站真的让我爱上了爵士乐。从老熊猫的节目里,我知道很多大名鼎鼎的爵士作曲家,Cole Poter,Irving Berlin,也让我知道许多爵士歌手,Frank Sinatra, Bing Crosby,还让我知道了很多大乐队时代的乐队指挥,Glenn Miller,Tommy Dorsey。这些都深深影响了我对于音乐的喜爱。

还记得高中的时候,参加论坛里的一个活动,活动的主题就是介绍爵士乐相关的人和事,我由于时间比较宽裕,参加积极性非常之高,还受到了大家的好评,最后获得了活动的一等奖——老熊猫的签名CD一张,里面是老熊猫制作的一期节目。封面还有老熊猫的照片和签名。这张CD现在还躺在我的书柜上,只不过上了大学之后没有再听过了。但是我对于爵士乐的爱,却更加深刻了。

老熊猫签名

这张图就是老熊猫先生在给我的礼物签名……转眼已经是06年的事情了……

可以说,没有老熊猫,就没有喜爱爵士乐的我。我怀念老熊猫,谢谢您对我无形的教导,我怀念老熊猫……

纪念熊光朴老先生(1935.05.01~2012.05.26)