移动终端 2012 年 11 月 11 日

Tasker 非常见问题FAQ

本文介绍了Android软件Tasker的使用过程中可能遇到的一些问题和解决方案。其中包括如何获取子Task的返回值、调用Shell导致Tasker卡死的解决方法、以及使用TTS时可能出现的错误提示和解决方法等。此外,文章还提到了作者将不定期更新并欢迎读者分享使用Tasker的经验和Profile。
Tasker是一个传说中“只有想不到,没有做不到”的Android软件,当然,使用如此“神器”肯定也会遇到不少麻烦的。本文整理出了自己使用Tasker遇到的一些的问题和解决方案,并以FAQ的形式列举出来。
本文将不定期更新,如果你有好的Profile或者使用Tasker的经历愿意分享给大家的话,欢迎留言或投稿给本站。
1、如何获取Perform Task的返回值?
如果要获取子Task(被调用的Task)的返回值,必须确保父Task(调用的Task)优先级比子Task的优先级低(根据我的使用经验需要将子Task的优先级设为10才可以)。 由于Tasker在同一时间只允许一个Task运行,当父Task调用子Task时,高优先级的子Task将中断父Task,在子Task运行结束后父Task获得返回值并继续运行。
2、为什么调用Shell后Tasker会卡死?
测试发现Tasker对Shell的支持并不是很好。如果在后台调用shell(即通过事件调用或在javascript里调用),将导致shell执行不返回结果,此时Tasker将一直等待(即使设置了Shell超时也没用)。由于任务默认优先级相等,而Tasker只能同时运行一个任务,后面等待运行的任务将任务队列填满,此时新的任务不会执行,也不能进队列等待,Tasker将弹出警告信息。 卡死后的解决办法就是重启Tasker,先禁用再启用即可。 建议尽量不要使用Shell,如果一定要,则必须在前台调用,比如通过点击一个按钮来调用。
2013-02-15更新:Tasker调用Shell会卡死的原因是因为Shell没有退出,在执行Shell后加一条exit命令退出即可,不会卡死。
3、使用TTS时,为什么提示unsupported locale “TTS name”?
Tasker每次调用TTS之前,会查询一遍当前的所有进程名,看是否有这个TTS进程存在,如果没有就提示不支持,有就可以成功调用。 很多时候都会出现这样的错误提示,可能是Tasker没有查询到TTS进程导致的。 我的解决方法就是每次调用TTS后获取执行结果,如果执行结果为false就表示TTS调用失败,那么可以等待一段时间,然后再执行一次并获取结果…如此一般提示出错一两次之后就可以成功了,建议重试次数为3.
示例代码:
var result = say(....);  
if(!result) { // retry 1  
    Wait(1500);  
    result = say(....);  
    if(!result) { // retry 2 //一般出错一次后重试一次就可以成功  
        Wait(1500);  
        result = say(....);  
        if(!result) { // retry 2  
            Wait(1500);  
            say(....); // 到这里再不成功就放弃了  
        }  
    }  
}  
根据Grant的建议修改如下:
var result = false;  
var count = 3;
while (count >=0) { 
	result = say(....);  
	if(result) {
		break;
	}
    Wait(1500);
    count--;
}
4、如何判断参数是否声明?
Tasker有个判断参数是否声明的条件isset。 不要试图在javascript里使用类似if(typeof mypar == 'undefined')这样的方法来判断,Tasker不会提示错误,但每次执行到这些语句的时候会自动退出。
5、执行Javascript时,数组已经声明,为什么提示没有声明?
Tasker里面的javascript数组必须在函数外面声明,在函数内部声明会出错。
6、为什么获取不到%CELLID的值或其它变量的值?
在Tasker里面获取%CELLID的值为变量名%CELLID,而不是具体的值。 Tasker或根据用户声明的变量来自动决定要不要更新这个变量的值。如果在Profile中没有提到%CELLID这个变量(即使在Task里面提到了),那么Tasker会认为这个变量没被使用,它并不会去更新这个变量的值,这也是Tasker的省电机制之一。 因此,如果要让Tasker自动更新某个变量的话,你需要在Profile提及它(在javascript里提及是无效的),最简单的就是建个task,每次开机的时候讲这个值赋给一个变量,然后什么都不做就可以了。
7、如何判断Mobile Data是否已经连接?
Tasker暂时没有办法判断移动数据是否已经连接。
2013-04-13更新:提供一种通过Shell获取连接状态的方法: Android Tasker 判断手机流量是否打开
8、如何判断是否有活动的WIFI连接?
这里的活动连接是指WIFI已经连接上并且能进行数据收发。 Tasker有一个WIFI信息变量%WIFII,它的值有下面几种情况:

%WIFII: WIFI没有打开 >>> SCAN <<< “可供连接的网络列表”: WIFI已经打开,附近有可供连接的热点,但是没有 活动连接。 >>> CONNECTTED <<< “IP, Mac参数等”: WIFI已经连接 在判断时,可以使用正则表达式判断%WIFII的值来判断WIFI的连接状态。

9、为什么条件为晃动的Profile设置后无效?
Shake设置后必须调整参数,默认参数的似乎不能工作,建议设置:Sensitivity- HighDuration- Medium
10、如果ProfileState条件不变,对应的Task会循环执行吗(即Tasker每轮询一次执行一次)?
不会,所有的Task在State满足后执行一次,只要State不变,就不会重复执行;只有当State状态不满足任务退出,下次再进入这个状态时才会再次执行。
比如有一个Profile似乎手机面朝下静音,如果手机面一直朝下,那么即使你调成普通模式,下次轮询时也不会再次执行设置静音这个任务;只有在退出这个状态,比如手机朝上,然后再朝下就会再次执行。
11、怎么限制一个Profile的执行频率?
长按Profile name,在弹出菜单里设置CountDown Time即可。
12、如何安全删除未使用的变量?
打开Variables标签页,从底部往上拉,将显示Variable过滤器,只选择Empty就可以过滤出那些未使用的变量。
13、我新建了一个Scene,为什么在Task里找不到(修改Scenne后为什么不即时生效)?
新建或更改Scene,必须保存后再次进入才能生效。
Task的更改也是一样的,必须保存后再次进入,它在Profile里面的引用才会改变,调试的时候一定要注意这一点。
14、为什么我点Javascriptlet右上角的RUN按钮提示OK,而运行javascript时却没有输出?
有些语法错误Tasker并不能检测出,比如错误判断一个变量是否存在方法 if(mypar)(相信很多像我这样的C++用户都会这样用),即使在运行时Tasker也不会提示错误,而是直接退出!遇到这种情况可以使用断点调试的方法来检查。
15、为什么Tasker的Widget文字背景是黑色的,而不是和其它图标一样是透明的?
因为它是Widget而不是普通的快捷方式图标。
16、如何停止正在播放的TTS?
在启动个TTS前,使用Perform Task启动一个停止TTS的任务。任务优先级为10(最高),任务弹出一个SceneScene里有一个按钮,点击执行Shut Up命令。最后别忘了将Sene Destory掉。
17、如何获取HTTP POST的返回值。
当使用HTTP POST提交数据时,%HTTPD是空值。
POST方式网站返回的结果并不存在%HTTPD变量中,而是写在文件中。在HTTP Post动作中设置Output file输出文件的路径,POST的结果就保存在这个文件中,读取这个文件就知道结果了。