Invoking Tasks Programatically
Note: it's recommended that the plugin interface is used instead of direct access wherever possible.
Tasker's tasks and (most) actions are all easily available to external applications via broadcast of intents. Your app
requires the Manifest permission net.dinglisch.android.tasker.PERMISSION_RUN_TASKS in order to
use this feature.
Convenience classes called
TaskerIntent and
ActionCodes are
available to make things easier, you just need
to include them in your project source and change the package name at the
top of the file.
The preference Misc / Allow External Access must be set in Tasker's UI.
From Tasker v1.0.18, you can present a task selection dialog with:
startActivityForResult( TaskerIntent.getTaskSelectIntent(), requestCode );
Get the selected task name in your onActivityResult() with getDataString() .
From Tasker v1.2.2, you can get a list of existing task names.
Following are some usage examples. If you have any trouble with these or others, please don't hesitate to
ask in the forum.
Call A Pre-Defined Task
This is the simplest usage, a task already defined by the user in the Tasker UI,
with no error-checking. The call is asynchronous, your app continues immediately
after the broadcast.
if ( TaskerIntent.testStatus( this ).equals( TaskerIntent.Status.OK ) ) {
TaskerIntent i = new TaskerIntent( "MY_USER_TASK_NAME" );
sendBroadcast( i );
}
From Tasker v1.1.1 & TaskerIntent v1.1, you can pass as many parameters as you like to the task:
i.addParameter( "value" );
The parameters are visible to the task when it runs as local variables
%par1, %par2 etc. In the example, %par1 is set to value.
From Tasker & TaskerIntent v1.2 you can stipulate arbitrary local (all lower-case) variable names and values to make available to the task:
i.addVariable( "%name", "value" );
Zip A File
This one performs a task which is constructed within the TaskerIntent
object. The priority is set to high, so that it is likely to override
any other tasks which are currently running e.g. a widget press task.
if ( TaskerIntent.testStatus( this ).equals( TaskerIntent.Status.OK ) ) {
TaskerIntent i = new TaskerIntent( "MY_ZIP_TASK" );
i.addAction( ActionCodes.ZIP_FILE ). // name of action
addArg( "/sdcard/test.txt" ). // argument list
addArg( true ). // delete original after
addArg( 9 ). // compression level
setTaskPriority( 9 ); // high priority
sendBroadcast( i );
}
You can find a list of the available actions are their arguments
in the Tasker UI. Names are case sensitive and English, even if
a localized version of Tasker is installed.
You might also want to use setTaskPriority() when broadcasting multiple tasks at one,
since tasks with the same priority are not guaranteed to execute in the reception order.
Alternatively, you could put all the actions in a single task, since those are
guaranteed to execute in order.
See the userguide
for information on Task scheduling in general.
Encrypt A File And Say Something
Here's a 'real' example. This one encrypts a file and makes an announcement when it's finished.
Status status = TaskerIntent.testStatus( this );
switch ( status ) {
case OK:
TaskerIntent i = new TaskerIntent( "NEW_ENCRYPT_TASK" );
// Add actions
i.addAction( ActionCodes.ENCRYPT_FILE ). // action code
addArg( "/sdcard/test.txt" ). // argument list
addArg( TaskerIntent.DEFAULT_ENCRYPTION_KEY ). // encryption key name
addArg( false ); // leave key after
i.addAction( ActionCodes.SAY ). // action code
addArg( "Finished!" ). // speech text
addArg( "com.google.android.tts:eng-gbr" ). // speech engine
addArg( 0 ). // sound channel
addArg( 5 ). // pitch
addArg( 5 ). // speed
addArg( false ); // continue task immediately
// Setup a receiver to get a) when task finished b) success/failure
// Note: you need to setup a new receiver for each task, because each
// receiver is tuned to a particular broadcast task
BroadcastReceiver br = new BroadcastReceiver() {
public void onReceive( Context context, Intent recIntent ) {
if ( recIntent.getBooleanExtra( TaskerIntent.EXTRA_SUCCESS_FLAG, false ) )
; // success, do something
else
Log.w( TAG, "Tasker reports failure." );
unregisterReceiver( this );
};
// You probably want to unregister this if the user leaves your app e.g. in onPause
// You may want to set a timeout in case e.g. Tasker's queue is full
registerReceiver( br, i.getCompletionFilter() );
// Start the task. This call exits immediately.
sendBroadcast( i );
default:
Log.w( TAG, "couldn't run Tasker task: " + status );
}
Error status values:
- NotInstalled: no Tasker package could be found on the device
- NoPermission: calling app does not have the needed Android permission (see above)
- NotEnabled: Tasker is disabled by the user.
- AccessBlocked: external access is blocked in the user preferences. You can
show the user the relevant preference with e.g.
startActivity( TaskerIntent.getExternalAccessPrefsIntent() )
- NoReceiver: nothing is listening for TaskerIntents. Probably a Tasker bug.
PendingIntents
Starting with Tasker 1.0.19, TaskerIntent sets a (long) random ID as the data portion of the
underlying Intent, so if you are using multiple TaskerIntents with PendingIntents you shouldn't need
to worry about clashes.
Miscellaneous Functions
static boolean havePermission( Context c );
Returns true if you have acquired the necessary Manifest permission PERMISSION_RUN_TASKS . If it
returns false, it may be because your app was installed before Tasker.
static boolean taskerInstalled( Context c );
Returns true if Tasker is installed on the device.
static Intent getTaskerInstallIntent( boolean marketFlag );
Gets an Intent that you can provide to startActivity() to
install Tasker from Android market or a download page.
|