如何通过Zebra DataWedge 11.3.28 Intent广播检测RFD40+TC21扳机按下
如何在RFD40 + TC21设备上通过Zebra DataWedge 11.3.28的Intent广播编程检测RFID枪扳机按下状态?
要实现检测RFID硬件扳机的按下/释放状态,需调整DataWedge配置以触发对应Intent广播,并在应用中监听这些事件。以下是具体步骤和代码修改:
1. 修改DataWedge配置,启用扳机状态事件输出
在你的DataWedgeUtility.createDWProfile方法中,需在RFID插件参数列表里添加启用扳机状态事件的配置,确保Intent输出插件能传递这些状态信息:
object DataWedgeUtility { private const val PROFILE_NAME = "DW_my_app" private const val ACTION_DATAWEDGE = "com.symbol.datawedge.api.ACTION" private const val EXTRA_CREATE_PROFILE = "com.symbol.datawedge.api.CREATE_PROFILE" private const val EXTRA_SET_CONFIG = "com.symbol.datawedge.api.SET_CONFIG" fun createDWProfile(context: Context) { sendDataWedgeIntentWithExtra( context, ACTION_DATAWEDGE, EXTRA_CREATE_PROFILE, PROFILE_NAME ) val profileConfig = Bundle() profileConfig.putString("PROFILE_NAME", PROFILE_NAME) profileConfig.putString("PROFILE_ENABLED", "true") profileConfig.putString("CONFIG_MODE", "UPDATE") val rfidConfig = Bundle() rfidConfig.putString("PLUGIN_NAME", "RFID") rfidConfig.putString("RESET_CONFIG", "true") val rfidProps = Bundle() // 保留原有RFID配置参数 rfidProps.putString("rfid_input_enabled", "true") rfidProps.putString("rfid_beeper_enable", "true") rfidProps.putString("rfid_antenna_transmit_power", "25") rfidProps.putString("rfid_memory_bank", "0") rfidProps.putString("rfid_session", "1") rfidProps.putString("rfid_filter_duplicate_tags", "true") rfidProps.putString("rfid_hardware_trigger_enabled", "true") rfidProps.putString("rfid_trigger_mode", "1") rfidProps.putString("rfid_tag_read_duration", "100") // 新增:启用扳机状态事件广播 rfidProps.putString("rfid_trigger_event_enabled", "true") // 设置扳机状态事件的自定义Intent Action rfidProps.putString("rfid_trigger_event_intent_action", context.resources.getString(R.string.rfid_trigger_intent_action)) // 设置Intent传递模式:0为广播模式 rfidProps.putString("rfid_trigger_event_intent_delivery", "0") rfidConfig.putBundle("PARAM_LIST", rfidProps) profileConfig.putBundle("PLUGIN_CONFIG", rfidConfig) val appConfig = Bundle() appConfig.putString( "PACKAGE_NAME", context.packageName ) appConfig.putStringArray("ACTIVITY_LIST", arrayOf("*")) profileConfig.putParcelableArray("APP_LIST", arrayOf(appConfig)) sendDataWedgeIntentWithExtra(context, ACTION_DATAWEDGE, EXTRA_SET_CONFIG, profileConfig) // 保留原有Intent输出、键盘输出配置代码... } // 保留原有sendDataWedgeIntentWithExtra方法... }
2. 在Activity中监听扳机状态Intent
基于你现有的单Activity+EventBus架构,扩展onNewIntent逻辑以处理扳机状态事件:
首先在strings.xml中添加自定义的扳机Intent Action:
<string name="rfid_trigger_intent_action">com.yourpackage.rfid.TRIGGER_EVENT</string>
然后修改MainActivity代码:
class MainActivity : AppCompatActivity() { private var readingFlag = false override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) DataWedgeUtility.createDWProfile(this) // 其他初始化代码... } override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) val action = intent.action val scanAction = resources.getString(R.string.activity_intent_filter_action) val triggerAction = resources.getString(R.string.rfid_trigger_intent_action) when(action) { scanAction -> handleScanData(intent) triggerAction -> handleTriggerEvent(intent) } } private fun handleScanData(intent: Intent) { // 保留原有处理RFID扫描数据的逻辑 try { val epc = intent.getStringExtra(resources.getString(R.string.datawedge_intent_key_data)) epc?.takeIf { it.isNotBlank() }?.let { val tagList = it.split("\n") tagList.forEach { tag -> EventBus.getDefault().post(TagReadEvent(epc = tag)) } } } catch (e: Exception) { // 异常处理 } } private fun handleTriggerEvent(intent: Intent) { // 获取扳机状态:1为按下,0为释放 val triggerState = intent.getIntExtra("com.symbol.datawedge.api.TRIGGER_STATE", -1) when(triggerState) { 1 -> { readingFlag = true // 发送扳机按下事件给Fragment EventBus.getDefault().post(RfidTriggerEvent(isPressed = true)) } 0 -> { readingFlag = false // 发送扳机释放事件给Fragment EventBus.getDefault().post(RfidTriggerEvent(isPressed = false)) } } } // 保留原有softRfidTrigger方法... }
3. 定义Trigger事件类
创建EventBus事件类,用于Activity与Fragment间传递扳机状态:
data class RfidTriggerEvent(val isPressed: Boolean)
关键说明
rfid_trigger_event_enabled设为"true"后,DataWedge会在扳机按下、释放时分别发送Intent广播- 扳机状态通过
com.symbol.datawedge.api.TRIGGER_STATEExtra传递,值1表示按下,0表示释放 - 建议将扫描数据Intent与扳机状态Intent的Action区分开,避免逻辑混淆
内容的提问来源于stack exchange,提问作者MarioV
相关产品推荐
相关产品推荐

