使用 Zebra Data wedge API 接收 Intent 时出现问题

如何解决使用 Zebra Data wedge API 接收 Intent 时出现问题

我们目前正在使用 zebra 设备进行公司资产管理,因此我们正在开发一个小型原型 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)

解决方法

让我们澄清一下。如果要使用 MC33R 读取 RFID 标签,则必须使用 Zebra RFID API3,而不是 Intent。 Zebra 正在考虑将 Intent 也用于 RFID,但目前最好的选择是使用 SDK,而不是 Intent Broadcaster/Receiver。如果您打算使用条形码扫描仪,那么官方的(新的)方式是通过意图。要获取意图,您必须在 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
            }
        }
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?