移动终端 2012 年 11 月 5 日

Android Tasker应用之自动查询并显示话费流量套餐信息

This article introduces how to use the Tasker app to automate the process of querying data plan information from a mobile carrier. The author describes the two main components of the process: sending a message to the carrier to retrieve the data plan information and analyzing the received message to display the relevant information on the device screen. The article outlines the steps to create a Tasker task to automatically send the message and a listener task to process the received message. The end result is a smart and automated way to retrieve and display data plan information on an Android device.

注:本文受”86088780”发表在机锋上的文章”【卐解!神器tasker应用教程】 之 入门与日常应用(1-11更新)“启发,特此感谢!

虽然Android平台有非常多的流量监控软件,但最准确的流量数据还是掌握在运营商手里。有些朋友可能像我一样时不时地发短信查询流量信息,这个操作在智能手机上显得太不智能了,本文将用Tasker让这个操作变得智能化。

功能需求

  • 每天早上闹钟响时,Tasker自动发送短信给运营商查询套餐信息。收到短信后Tasker自动分析短信内容,并将话费余额,流量信息等显示在桌面上。
  • 用户可以手动随时给运营商发短信查询,Tasker自动判断为套餐查询信息后提取信息并显示。
  • 显示的内容包括更新时间、当前话费、话费余额、剩余流量、剩余语音时长(由运营商提供的信息确定)
最终需要实现的效果:
data plan

实现分析

整个操作由两个部分组成:
  • 发送部分:早上闹钟响起时自动给运营商发送一条短信查询套餐信息;
  • 接收部分:当收到运营商的套餐信息(可以是自动查询或手动查询的结果)后自动分析短信内容并显示。 发送部分比较比较好实现,可以建立一个自动发短信任务,这个任务由闹钟响起事件触发。另外为了避免其它时候的闹钟触发这个任务,可以增加一个时间限制,比如只有在早上7点到8点之间的闹钟才能触发。
接受部分由一个短信监听任务完成,每次收到短信时将触发这个任务。这个任务首先判断短信发送者是不是运营商,然后判断短信内容是不是查询套餐的短信(使用正则表达式匹配特征字符串),最后就是提取有用信息并发到前端(Minimalistic Text)显示。

自动发送短信

新建一个Profile,增加两个条件Context:事件条件为Alarm Clock,事件条件为7:00~9:00;
添加一个发送短信的任务,内容为101,接收者为10010(根据你的运营商和套餐查询命令而定)。
你可以直接导入我配置好的Profile(针对中国联通3G套餐),点击下载:send_sms_on_alarm.prf,导入后的Profile如下图:
profile send sms on alarm

短信内容提取

注:各个运营商的套餐查询短信不容,这里以中国联通为例。
新建一个Profile,事件EventReceived Text并且Sender为10010
添加一个匿名任务;
Profile里已经完成了短信发送者的过滤,因此在Task里收到的短信肯定是10010发的,但是10010发的不一定是套餐查询短信,也可能是广告,因此需要判断是否是套餐短信,这里使用正则表达式来完成。联通3G短信的大致匹配为”^尊敬的[\s\S]*您当前套餐为[\s\S]*本月可用金额[\s\S]*含国内手机上网流量”。
确信短信内容无误后就可以进行信息提取了,下面是一条完整的话费查询信息:

尊敬的某某用户,您当前套餐为WCDMA(3G)-46元基本套餐B套餐。本月可用金额为54.49元。当前实时话费合计71.44元,3G套包内含国内语音拨打时长120分钟,现已使用20分钟;含国内手机上网流量40MB,现已使用0MB;含国内可视电话拨打时长5分钟,现已使用0分钟;含多媒体使用量3M,现已使用0M;含文本使用量5T,现已使用0T。本次查询结果存在时延,敬请留意。广东联通。【买3G就上 10010.com】 Tasker内置了字符串操作函数,我们可以直接使用它来切割字符串,我们将上面这段内容赋值给%mmsgb变量,下面是具体的步骤:

  • STEP 1 输入:        mmsgb 分隔符:“本月可用金额为” 结果: mmsgb1: 尊敬的某某用户,您当前套餐为WCDMA(3G)-46元基本套餐B套餐。 mmsgb2: 115.43元。当前实时话费合计71.74元,3G套包内含国内语音拨打时长120分钟,现已使用13分钟;含国内手机上网流量40MB,现已使用20MB;含国内可视电话拨打时长5分钟,现已使用0分钟;含多媒体使用量3M,现已使用0M;含文本使用量5T,现已使用0T。本次查询结果存在时延,敬请留意。广东联通。【买3G就上 10010.com】

  • STEP 2 输入:      mmsgb2 分隔符: “。当前实时话费合计” 结果: mmsgb21: 115.43元 (话费余额信息) mmsgb22: 71.74元,3G套包内含国内语音拨打时长120分钟,现已使用13分钟;含国内手机上网流量40MB,现已使用20MB;含国内可视电话拨打时长5分钟,现已使用0分钟;含多媒体使用量3M,现已使用0M;含文本使用量5T,现已使用0T。本次查询结果存在时延,敬请留意。广东联通。【买3G就上 10010.com】

提示:Tasker的字符串分割功能会自动将结果保存到数组中,如果你学过编程的话,应该很容易看出mmsgb21其实就是mmsgb[2][1]的意思,只不过Tasker的数组没有方括号而已。
按上面的步骤依次提取剩下的信息,你也可以下载我配置好的Profile(只对联通3G套餐有效),点击下载:send_sms_to_check_phone_quota_recv_.prf

信息显示

前端依然使用Minimalistic Text来显示,在短信接收的Profile中有一个动作是将提取出的内容发送给Minimalistic Text 的”%DPQUOTA”变量,我们只需在Minimalistic Text里配置显示就可以了。
先添加一个3x1的Widget,排版方式为自定义,然后添加一个本地变量就可以显示了,板式可以自己美化一下。
set MT display
最后手动发条短信测试一下吧,如果显示没问题的话以后每天早上这个过程都可以由Tasker自动完成了。

更新日志

2012-11-22:
使用py4a脚本可以在收到短信后可以自动删除或标记短信已读,需要这个功能的朋友可以可以参考py4a的API文档:http://code.google.com/p/android-scripting/wiki/ApiReference。下面是一段删除联通的未读短信的示例代码:
"""Delete unread msg from China Unicom."""  
  
__author__ = 'Lance Liao'  
__copyright__ = 'Copyright (c) 2012, ShuYZ.com'  
  
import android  
  
droid = android.Android()  
msgIDs = droid.smsGetMessageIds(True, 'inbox').result # List all unread msg by ID  
if(msgIDs.__len__() > 0):  
    for msgID in msgIDs: # Check if the msg is send from China Unicom  
        if ('10010' == droid.smsGetMessageById(msgID).result[u'address']):  
            droid.smsDeleteMessage(msgID) #delete msg