Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Problem receiving Intents with Zebra Data wedge API

We are currently using a zebra device for company asset management so we are developing a small prototype android app to scan RFID tags. I've read from the data wedge API that the app can get scanned output has an intent broadcast.

But the app is unable to receive any intents.

Device : Zebra MC33

Data wedge version : 7.3

I've tried using the following

Profile Settings:

Intent Action : my.prototype.app.SCAN
Intent Delivery Type: Broadcast Intent.
Intent Category: Default.
Added to Associated Apps

AndroidManifest.xml

    <receiver
        android:name=".ScanIntentReceiver"
        android:enabled="true"
        android:exported="true" />

ScanIntentReceiver.kt

abstract class ScanIntentReceiver : BroadcastReceiver() {

    abstract fun onReceiveScan(data: ScannerOutput)

    override fun onReceive(p0: Context?, p1: Intent?) {
        Timber.d("S1: Broadcast Scan Intent Received.")
        p0?.let { context ->
            p1?.let { intent ->
                when (intent.action) {
                    BuildConfig.intentAction -> {
                        try {
                            val data = parseData(intent, context)
                            Timber.d("Data received: $data")
                            onReceiveScan(data)
                        } catch (ex: Exception) {
                            Timber.d("Parsing error")
                            Timber.d(ex)
                        }

                    }
                    else -> {
                        Timber.d("No Suitable Action.")
                    }
                }

            }
        }
    }
}

Also tried using the "Send via Start Activity"

Profile Settings:

Intent Action : my.prototype.app.SCAN
Intent Delivery Type: Send via StartActivity.
Intent Category: Default.
Added to Associated Apps

AndroidManifest.xml

<activity
            android:name=".activity.ScanActivity"
            android:launchMode="singleTask">
            <intent-filter>
                <action android:name="${intentAction}" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

ScanActivity.kt

override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        Timber.d("Received Intent via Activity.")
        intent?.let {
            try {
                val data = parseData(it, this)
                viewModel.processOutput(data)
            } catch (ex: Exception) {
                Timber.e(ex)
            }
        }
    }

Any help is appreciated. Thanks in advance.

UPDATE:

private fun parseData(intent: Intent, ctx: Context): ScannerOutput {
val decodedSource =
  intent.getStringExtra(ctx.getString(R.string.datawedge_intent_key_source))

val decodedData =
    intent.getStringExtra(ctx.getString(R.string.datawedge_intent_key_data))
val decodedLabelType =
intent.getStringExtra(ctx.getString(R.string.datawedge_intent_key_label_type))
    ....

}

UPDATE:

 val filter = IntentFilter()
        filter.addCategory(Intent.CATEGORY_DEFAULT)
        filter.addAction(BuildConfig.intentAction)
        registerReceiver(scanIntentReceiver, filter)
like image 393
wishnuprathikantam Avatar asked Feb 17 '26 00:02

wishnuprathikantam


1 Answers

Let's clarify things a bit. If you want to read RFID tags using the MC33R, then you must use Zebra RFID API3, not intents. Zebra is considering using the intents also for RFID, but at the moment the best option is to use the SDK, not the intent Broadcaster/Receiver. If you intend to use the barcode scanner, then the official (new) way of doing it is through intents. To get the intents you must configure a profile in the Data Wedge, you must activate intent broadcasing and specify the intent action in the profile, if you do so, you'll receive the intent. Look for the following settings in the data Wedge profile (default profile is good):

Intent Output = ON 
Intent action = my.prototype.app.SCAN 
Intent distribution (or delivery): Broadcast

I can assure you that these settings will work for the barcode scanner, but in case you want to use the RFID antenna, download the API3 SDK from Zebra Developer site and follow the examples.

***UPDATE

val filter = IntentFilter()
filter.addCategory(Intent.CATEGORY_DEFAULT)
filter.addAction("my.prototype.app.SCAN")//here set the action (same as in DataWedge app)
this.requireContext().registerReceiver(this, filter)

Implement

BroadcastReceiver

and add:

override fun onReceive(context: Context?, intent: Intent?) {
        //Receives readings from barcode scanner
        val action = intent!!.action

        if (action == "my.prototype.app.SCAN") {
            val decodedData = intent.getStringExtra("com.symbol.datawedge.data_string")
            

            if (decodedData != null) {
                //decodedData is your barcode
            }
        }
    }
like image 170
Sergiob Avatar answered Feb 18 '26 16:02

Sergiob