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

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

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

1、功能需求

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

最终需要实现的效果:

2、实现分析

整个操作由两个部分组成:

  • 发送部分:早上闹钟响起时自动给运营商发送一条短信查询套餐信息;
  • 接收部分:当收到运营商的套餐信息(可以是自动查询或手动查询的结果)后自动分析短信内容并显示。
    发送部分比较比较好实现,可以建立一个自动发短信任务,这个任务由闹钟响起事件触发。另外为了避免其它时候的闹钟触发这个任务,可以增加一个时间限制,比如只有在早上7点到8点之间的闹钟才能触发。

接受部分由一个短信监听任务完成,每次收到短信时将触发这个任务。这个任务首先判断短信发送者是不是运营商,然后判断短信内容是不是查询套餐的短信(使用正则表达式匹配特征字符串),最后就是提取有用信息并发到前端(Minimalistic Text)显示。

3、自动发送短信

新建一个Profile,增加两个条件Context:事件条件为Alarm Clock,事件条件为7:00~9:00;

添加一个发送短信的任务,内容为101,接收者为10010(根据你的运营商和套餐查询命令而定)。

你可以直接导入我配置好的Profile(针对中国联通3G套餐),点击下载:send_sms_on_alarm.prf,导入后的Profile如下图:

<TaskerData sr="" dvi="1" tv="1.3.2b1m">
    <Profile sr="prof23">
        <cdate>1350492225043</cdate>
        <edate>1352092212443</edate>
        <id>23</id>
        <mid0>27</mid0>
        <nme>send sms on alarm</nme>
        <Event sr="con0" ve="2">
            <code>305</code>
            <Str sr="arg0" ve="3"/>
        </Event>
        <Time sr="con1">
            <fh>7</fh>
            <fm>0</fm>
            <th>9</th>
            <tm>0</tm>
        </Time>
    </Profile>
    <Task sr="task27">
        <cdate>1350493303738</cdate>
        <edate>1352092033132</edate>
        <id>27</id>
        <Action sr="act0" ve="3">
            <code>41</code>
            <lhs>%AIR</lhs>
            <op>1</op>
            <rhs>off</rhs>
            <Str sr="arg0" ve="3">10010</Str>
            <Str sr="arg1" ve="3">101</Str>
            <Int sr="arg2" val="0"/>
        </Action>
    </Task>
</TaskerData>

4、短信内容提取

注:各个运营商的套餐查询短信不容,这里以中国联通为例。

新建一个Profile,事件EventReceived Text并且Sender为10010

添加一个匿名任务;

Profile里已经完成了短信发送者的过滤,因此在Task里收到的短信肯定是10010发的,但是10010发的不一定是套餐查询短信,

也可能是广告,因此需要判断是否是套餐短信,这里使用正则表达式来完成。联通3G短信的大致匹配为"^尊敬的[\s\S]您当前套餐为[\s\S]本月可用金额[\s\S]*含国内手机上网流量"。

确信短信内容无误后就可以进行信息提取了,下面是一条完整的话费查询信息:

尊敬的某某用户,您当前套餐为WCDMA(3G)-46元基本套餐B套餐。本月可用金额为115.43元。当前实时话费合计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

<TaskerData sr="" dvi="1" tv="1.3.2b1m">
    <Profile sr="prof28">
        <cdate>1350493482359</cdate>
        <edate>1352092746914</edate>
        <id>28</id>
        <mid0>18</mid0>
        <nme>send sms to check phone quota(recv)</nme>
        <Event sr="con0" ve="2">
            <code>7</code>
            <pri>0</pri>
            <Int sr="arg0" val="2"/>
            <Str sr="arg1" ve="3">10010</Str>
            <Str sr="arg2" ve="3"/>
        </Event>
    </Profile>
    <Task sr="task18">
        <cdate>1350483797760</cdate>
        <edate>1351329998620</edate>
        <id>18</id>
        <nme>sms query phone quota to MT</nme>
        <pri>10</pri>
        <Action sr="act0" ve="3">
            <code>547</code>
            <label>msg content</label>
            <Str sr="arg0" ve="3">%mmsgb</Str>
            <Str sr="arg1" ve="3">%SMSRB</Str>
            <Int sr="arg2" val="0"/>
            <Int sr="arg3" val="0"/>
        </Action>
        <Action sr="act1" ve="3">
            <code>547</code>
            <label>msg check result, default is 1(pass)</label>
            <Str sr="arg0" ve="3">%mmsgcheck</Str>
            <Str sr="arg1" ve="3">1</Str>
            <Int sr="arg2" val="0"/>
            <Int sr="arg3" val="0"/>
        </Action>
        <Action sr="act10" ve="3">
            <code>590</code>
            <Str sr="arg0" ve="3">%mmsgb2223</Str>
            <Str sr="arg1" ve="3">;含国内可视电话拨打时长</Str>
            <Int sr="arg2" val="0"/>
        </Action>
        <Action sr="act11" ve="3">
            <code>547</code>
            <label>save information</label>
            <Str sr="arg0" ve="3">%mpquota</Str>
            <Str sr="arg1" ve="3">更新时间: %SMSRD %SMSRT
可用余额: %mmsgb21
当前话费: %mmsgb221
语音时长: 已用 %mmsgb22221 / 本月可用 %mmsgb2221
套餐流量: 已用 %mmsgb22231 / 本月可用 %mmsgb22222</Str>
            <Int sr="arg2" val="0"/>
            <Int sr="arg3" val="0"/>
        </Action>
        <Action sr="act12" ve="3">
            <code>14593</code>
            <Bundle sr="arg0">
                <Vals sr="val">
                    <com.twofortyfouram.locale.intent.extra.BLURB>%DPQUOTA = %mpquota</com.twofortyfouram.locale.intent.extra.BLURB>
                    <com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type>
                    <de.devmil.minimaltext.locale.extras.VAR_NAME>%DPQUOTA</de.devmil.minimaltext.locale.extras.VAR_NAME>
                    <de.devmil.minimaltext.locale.extras.VAR_NAME-type>java.lang.String</de.devmil.minimaltext.locale.extras.VAR_NAME-type>
                    <de.devmil.minimaltext.locale.extras.VAR_TEXT>%mpquota</de.devmil.minimaltext.locale.extras.VAR_TEXT>
                    <de.devmil.minimaltext.locale.extras.VAR_TEXT-type>java.lang.String</de.devmil.minimaltext.locale.extras.VAR_TEXT-type>
                    <net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>de.devmil.minimaltext.locale.extras.VAR_TEXT</net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>
                    <net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>java.lang.String</net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>
                    <net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled>
                    <net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type>
                </Vals>
            </Bundle>
            <Str sr="arg1" ve="3">de.devmil.minimaltext</Str>
            <Str sr="arg2" ve="3">Minimalistic Text</Str>
        </Action>
        <Action sr="act13" ve="3">
            <code>38</code>
        </Action>
        <Action sr="act2" ve="3">
            <code>547</code>
            <label>check if send by China Unicom</label>
            <lhs>%SMSRF</lhs>
            <op>2</op>
            <rhs>10010</rhs>
            <Str sr="arg0" ve="3">%mmsgcheck</Str>
            <Str sr="arg1" ve="3">0</Str>
            <Int sr="arg2" val="0"/>
            <Int sr="arg3" val="0"/>
        </Action>
        <Action sr="act3" ve="3">
            <code>547</code>
            <label>check if msg pattern ok</label>
            <lhs>%mmsgb</lhs>
            <op>12</op>
            <rhs>^尊敬的[\s\S]*您当前套餐为[\s\S]*本月可用金额[\s\S]*含国内手机上网流量</rhs>
            <Str sr="arg0" ve="3">%mmsgcheck</Str>
            <Str sr="arg1" ve="3">0</Str>
            <Int sr="arg2" val="0"/>
            <Int sr="arg3" val="0"/>
        </Action>
        <Action sr="act4" ve="3">
            <code>37</code>
            <label>msg check ok, do split</label>
            <lhs>%mmsgcheck</lhs>
            <op>5</op>
            <rhs>1</rhs>
        </Action>
        <Action sr="act5" ve="3">
            <code>590</code>
            <Str sr="arg0" ve="3">%mmsgb</Str>
            <Str sr="arg1" ve="3">本月可用金额为</Str>
            <Int sr="arg2" val="0"/>
        </Action>
        <Action sr="act6" ve="3">
            <code>590</code>
            <Str sr="arg0" ve="3">%mmsgb2</Str>
            <Str sr="arg1" ve="3">。当前实时话费合计</Str>
            <Int sr="arg2" val="0"/>
        </Action>
        <Action sr="act7" ve="3">
            <code>590</code>
            <Str sr="arg0" ve="3">%mmsgb22</Str>
            <Str sr="arg1" ve="3">,3G套包内含国内语音拨打时长</Str>
            <Int sr="arg2" val="0"/>
        </Action>
        <Action sr="act8" ve="3">
            <code>590</code>
            <Str sr="arg0" ve="3">%mmsgb222</Str>
            <Str sr="arg1" ve="3">,现已使用</Str>
            <Int sr="arg2" val="0"/>
        </Action>
        <Action sr="act9" ve="3">
            <code>590</code>
            <Str sr="arg0" ve="3">%mmsgb2222</Str>
            <Str sr="arg1" ve="3">;含国内手机上网流量</Str>
            <Int sr="arg2" val="0"/>
        </Action>
        <Img sr="icn" ve="2">
            <icn>2130837510</icn>
        </Img>
    </Task>
</TaskerData>

5、信息显示

前端依然使用Minimalistic Text来显示,在短信接收的Profile中有一个动作是将提取出的内容发送给 Minimalistic Text 的"%DPQUOTA"变量

我们只需在Minimalistic Text里配置显示就可以了。

先添加一个3x1的Widget,排版方式为自定义,然后添加一个本地变量就可以显示了,板式可以自己美化一下。

最后手动发条短信测试一下吧,如果显示没问题的话以后每天早上这个过程都可以由Tasker自动完成了。

时间: 2024-10-06 14:22:13

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

Android 文字过长TextView如何自动截断并显示成省略号

当用TextView来显示标题的时候,如果标题内容过长的话,我们不希望其换行显示,这时候我们需要其自动截断,超过的部分显示成省略号. 如下图所示,标题过长,自动换行了,显示不是很好看. 这时候我们需要其自动截断,超过的部分显示成省略号. xml布局里需要将textview的下面属性设置下: android:ellipsize="end" android:singleLine="true" 其中:android:ellipsize="start"-

Android 利用ExpandableListView显示和查询仿QQ分组列表用户信息

在我们的项目开发过程中,经常会对用户的信息进行分组,即通过组来显示用户的信息,同时通过一定的查询条件来显示查询后的相关用户信息,并且通过颜色选择器来设置列表信息的背景颜色. 其中借鉴xiaanming:http://blog.csdn.net/xiaanming/article/details/12684155 下面来看看项目运行后的效果图以及代码结构图: 下面通过代码来实现整个效果. 1.主界面布局activity_main.xml <span style="font-size:18px

【Android Developers Training】 103. 查询当前地点

注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer.android.com/training/location/retrieve-current.html 样例代码: LocationUpdates.zip 地点服务自动维护用户当前的地点,所以你的应用所要做的事情就是在需要时去获取它.地点的精确度是基于你所申请的地点查询权限,以及当前设备上激活的的

Android中手机号码归属地查询实现

这部分是昨天学习的,但是因为眼睛超负荷所以拖到现在,以后要合理规划时间. 目前手机里面的号码归属地查询主要是通过两种方式:1.联网查询,2.匹配本机归属地数据库. 我认为两种结合方式最好,在本地数据库中匹配不到的在进行联网查询,能大大增加匹配效果,并且不用过于增加本地数据库容量而增大安装包大小. 步骤:1.开启软件的时候把数据库从assets目录拷贝到files目录下,如果已存在,则不用重新拷贝. 2.实现界面. 3.实现工具类PhoneAddressUtils的getPhoneAddress(

android系统cpu资源相关查询

android系统cpu资源相关查询 我们都知道android是基于linux系统内核的,在linux系统中我们查看系统资源消耗情况,一个可以直接通过命令行的top命令来看,里面有cpu具体的使用情况,当然在android系统上也还是保留了的.top还是很有用,那在android应用上怎么表现出来呢? 在[设置]应用中,在开发者选项里面就有一项现成的看cpu使用情况的,具体情况的显示是显示在ui的系统层,而不是activities,是始终高于activities的,保障在任何应用界面里都可以显示

手把手教你Android来去电通话自动录音的方法

我们在使用Android手机打电话时,有时可能会需要对来去电通话自动录音,本文就详细讲解实现Android来去电通话自动录音的方法,大家按照文中的方法编写程序就可以完成此功能. 来去电自动录音的关键在于如何监听手机电话状态的转变: 1)来电的状态的转换如下(红色标记是我们要用到的状态) 空闲(IDEL)——> 响铃(RINGING)——> 接听(ACTIVE)——> 挂断(经历DISCONNECTING——DISCONNECTED)——> 空闲(IDEL) 或者  空闲(IDEL)

(四)Web应用开发---查询Grid显示、行编辑

查询Grid显示.行编辑,UI设计类如 Copy html代码到新建Html <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head>    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />    <title>资产日常管理&l

Android gen根目录下自动生成的R文件指向问题

今天才弄明白,原来在调用vitamio包的时候使用它们的R文件,然后在迁入广告的时候出现了问题,但是瞎胡搞半天后把问题解决了,可没有明白这是什么原因. 今天更新应用又出现了相同的情况,无意中打开了gen的根目录妈蛋!发现里面的报名根本就不是我现在应用的包名.而是调用的那个工程的包名!这下终于找到根本原因了,但是怎么解决呢???----------->修改包名呗~~~~~~~可是你改了它又会自动生成了原来的那个,--------------后来终于发现原来这个R文件的包名适合manifest文件中

用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。

最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量.<s:iterator>标签有一个value属性,用来存放在Action类的方法中存数据的list集合,还有一个id,好像是说指定集合的索引的意思,就是给list集合遍历出来的每个对象加上一个数字标签,反正我是这么理解的,没用过.还有一个很重要,就是var变量,我在s:iterator按ctr