【问题标题】:Problem receiving Intents with Zebra Data wedge API使用 Zebra 数据楔形 API 接收 Intent 时出现问题
【发布时间】:2021-03-17 13:09:30
【问题描述】:

我们目前正在使用斑马设备进行公司资产管理,因此我们正在开发一个小型原型 Android 应用程序来扫描 RFID 标签。我从数据楔形 API 中了解到,该应用可以获取扫描输出具有意图广播。

但应用无法接收任何意图。

设备:Zebra MC33

数据楔形版本:7.3

我已经尝试使用以下方法

个人资料设置:

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.")
                    }
                }

            }
        }
    }
}

还尝试使用“通过启动活动发送”

个人资料设置:

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)
            }
        }
    }

感谢任何帮助。提前致谢。

更新:

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))
    ....

}

更新:

 val filter = IntentFilter()
        filter.addCategory(Intent.CATEGORY_DEFAULT)
        filter.addAction(BuildConfig.intentAction)
        registerReceiver(scanIntentReceiver, filter)

【问题讨论】:

    标签: android kotlin barcode-scanner rfid datawedge


    【解决方案1】:

    让我们稍微澄清一下。如果您想使用 MC33R 读取 RFID 标签,则必须使用 Zebra RFID API3,而不是 Intents。 Zebra 正在考虑将意图也用于 RFID,但目前最好的选择是使用 SDK,而不是意图广播器/接收器。如果您打算使用条形码扫描仪,那么官方(新)的做法是通过意图。要获取意图,您必须在 Data Wedge 中配置配置文件,您必须激活意图广播并在配置文件中指定意图操作,如果这样做,您将收到意图。在 data Wedge 配置文件中查找以下设置(默认配置文件很好):

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

    我可以向您保证,这些设置适用于条形码扫描仪,但如果您想使用 RFID 天线,请从 Zebra 开发者网站下载 API3 SDK 并按照示例进行操作。

    ***更新

    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)
    

    实施

    广播接收器

    并添加:

    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
                }
            }
        }
    

    【讨论】:

    • 请查看此文档:techdocs.zebra.com/datawedge/7-3/guide/input/rfid 我认为他们也为 RFID 添加了意图。谢谢。
    • 我没有说他们没有。我说这不是最好的方法(……还)。一年前几乎没有。对于生产应用程序来说,使用意图来读取 RFID 还为时过早,相反,意图和 Brodacast 接收器是您想要使用条形码扫描仪的方式。如果你想用 Intent,最好再等一等,让 Zebra 整合技术
    • 好的,谢谢,我也尝试过使用常规条形码,但条形码被捕获为输入文本而不是意图,知道为什么会这样吗?
    • 我已将接收器添加到清单中,同时在活动中使用注册和取消注册。也尝试了 onNewIntent 但仍然没有运气。
    • 我已将解析数据方法添加到我的问题中,根据您的回答,我可以看到我正确地注册了意图。但是,即使是“S1:收到广播扫描意图”。看不到放在 if/when 语句之前的日志。
    猜你喜欢
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多