Using DataWedge APIs

DataWedge 11.1

Overview

DataWedge APIs operate primarily through Android intents - specific commands that can be used by other applications to control data capture without the need to directly access the underlying hardware APIs. Intents are implemented as extras of an action intent, permitting multiple API calls to be sent as extras using a single intent action. This guide describes the functionality of the intents supported by DataWedge and their effects on data capture and DataWedge Profiles and settings.

Note: When querying the DataWedge status (Get DataWedge Status) or sending any intent API to DataWedge soon after a device reboot, DataWedge cannot receive the intent if DataWedge did not start or did not complete the initialization process. Zebra recommends to implement a retry mechanism if a response from DataWedge is not received from the intent API sent to DataWedge.

Additional resources:


Requirements

The use of DataWedge APIs requires experience with Java programming and familiarity with Android Intents. It also requires knowledge of DataWedge usage, features and terminology. For more information about DataWedge, see the DataWedge Getting Started Guide and the Architecture Overview. It also might be helpful to read the DataWedge section of the Integrator Guide included with Zebra devices.

Sending Intents

Multiple DataWedge API calls can be passed as extras on a single intent action. The syntax is as follows:


// Send multiple intents as extras

    Intent i = new Intent();
    i.setAction("com.symbol.datawedge.api.ACTION");
    String[] profiles = {"MainInventory"};
    i.putExtra("com.symbol.datawedge.api.DELETE_PROFILE", profiles);
    i.putExtra("com.symbol.datawedge.api.GET_VERSION_INFO", "");

Receiving Results

For intents that query DataWedge for information (such as in "GET_ACTIVE_PROFILE"), the app must register to receive the result with a filter that identifies the action and category of the result intent. The code below shows how to register the broadcast receiver to receive the results:


// Register broadcast receiver and filter results

    void registerReceivers() {
        IntentFilter filter = new IntentFilter();
        filter.addAction("com.symbol.datawedge.api.RESULT_ACTION");
        filter.addCategory("android.intent.category.DEFAULT");
        registerReceiver(mybroadcastReceiver, filter);
    }

//Receiving the result

    private BroadcastReceiver myBroadcastReceiver = new BroadcastReceiver(){

    @Override
        public void onReceive(Context context, Intent intent){

            Bundle extras = getIntent().getExtras();
            if (intent.hasExtra("com.symbol.datawedge.api.RESULT_GET_ACTIVE_PROFILE")){
                String activeProfile = extras.getString("com.symbol.datawedge.api.RESULT_GET_ACTIVE_PROFILE");

Important: DataWedge API commands are not queued, and might be ignored if sent while DataWedge is busy processing an earlier intent. When an API command is sent, DataWedge executes the command only if it is not busy doing something else. Exceptions:

  • STOP_SCANNING - immediately interrupts a scan operation
  • DISABLE_PLUGIN - immediately disables the current scanner input plug-in

To help ensure proper execution, Zebra recommends inserting delay code prior to critical commands. See the SoftScanTrigger API for an example.

Nested Bundles

Nested bundles allows a "bundle" of values to be included as one value in another bundle. Bundles also can be multiple layers deep. For example, the image below illustrates a PARAM_LIST bundle nested within the PLUGIN_CONFIG[0] bundle nested within the API call SET_CONFIG. Nesting is required to configure with intents the many parameters contained in a Profile.

The image further illustrates that the SET_CONFIG API call can implement a second nested bundle, PLUGIN_CONFIG[n], which can contain its own PARAM_LIST.


Example

The Java code below implements a nested bundle.

//Using the SET_CONFIG API and a nested bundle.


Bundle bMain = new Bundle();
bMain.putString("PROFILE_NAME","Profile2");
bMain.putString("PROFILE_ENABLED", "true");
bMain.putString("CONFIG_MODE","CREATE_IF_NOT_EXIST");
bMain.putString("RESET_CONFIG", "true");


Bundle bundleApp1 = new Bundle();
bundleApp1.putString("PACKAGE_NAME","com.symbol.emdk.simulscansample1");
bundleApp1.putStringArray("ACTIVITY_LIST", new String[]{
        "com.symbol.emdk.simulscansample1.DeviceControl",
        "com.symbol.emdk.simulscansample1.MainActivity",
        "com.symbol.emdk.simulscansample1.ResultsActivity.*",
        "com.symbol.emdk.simulscansample1.ResultsActivity2",
        "com.symbol.emdk.simulscansample1.SettingsFragment1"});


Bundle bundleApp2 = new Bundle();
bundleApp2.putString("PACKAGE_NAME","com.example.intents.datawedgeintent");
bundleApp2.putStringArray("ACTIVITY_LIST", new String[]{
        "com.example.intents.datawedgeintent.DeviceControl",
        "com.example.intents.datawedgeintent.MainActivity",
        "com.example.intents.datawedgeintent.ResultsActivity",
        "com.example.intents.datawedgeintent.SettingsFragment1"});

Bundle bundleApp3 = new Bundle();
bundleApp3.putString("PACKAGE_NAME","*");
bundleApp3.putStringArray("ACTIVITY_LIST", new String[]{"*"});


Bundle bundleApp4 = new Bundle();
bundleApp4.putString("PACKAGE_NAME","com.symbol.myzebraapp");
bundleApp4.putStringArray("ACTIVITY_LIST", new String[]{"*"});

bMain.putParcelableArray("APP_LIST", new Bundle[]{
        bundleApp1
        ,bundleApp2
        ,bundleApp3
        ,bundleApp4
});

Intent i = new Intent();
i.setAction("com.symbol.datawedge.api.ACTION");
i.putExtra("com.symbol.datawedge.api.SET_CONFIG", bMain);
this.sendBroadcast(i);

Related Guides:

SEE ALSO:

Zebra Support Central | Integrator Guides, Product Manuals, Software Downloads and Support

LaunchPad | Zebra Developer Community

Intent | Android Developers

Intents and Intent Filters | Android Developers

Android Intents | Tutorial