适配扫描枪
C:\projects_rust\sgbstock\sgbstock\android\app\src\main\kotlin\com\sgbstock\sgbstock\MainActivity.kt
package com.sgbstock.sgbstock
import android.content.IntentFilter
import android.util.Log
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.EventChannel
class MainActivity : FlutterActivity() {
companion object {
private const val TAG = "MainActivity"
private const val CHANNEL = "barcode_scanner/event"
}
private lateinit var eventSink: EventChannel.EventSink
private lateinit var barcodeReceiver: BarcodeBroadcastReceiver
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
// Initialize EventChannel
val channel = EventChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL)
channel.setStreamHandler(object : EventChannel.StreamHandler {
override fun onListen(arguments: Any?, events: EventChannel.EventSink?) {
Log.d(TAG, "EventChannel onListen")
eventSink = events!!
registerBroadcastReceiver()
}
override fun onCancel(arguments: Any?) {
Log.d(TAG, "EventChannel onCancel")
unregisterBroadcastReceiver()
}
})
}
private fun registerBroadcastReceiver() {
// Create broadcast receiver with callback
barcodeReceiver = BarcodeBroadcastReceiver {
sendBarcodeToFlutter(it)
}
// Create intent filter for barcode scanner broadcasts
val filter = IntentFilter()
filter.addAction("com.android.decodewedge.decode_action")
filter.addAction("com.symbol.datawedge.api.NOTIFICATION_ACTION")
filter.addAction("com.zebra.scan.service.BARCODE_DECODED")
filter.addAction("com.sunmi.scanner.ACTION_DATA_CODE_RECEIVED")
filter.addAction("com.xcheng.scanner.action.BARCODE_DECODING_BROADCAST")
// Register broadcast receiver
registerReceiver(barcodeReceiver, filter)
Log.d(TAG, "Broadcast receiver registered")
}
private fun unregisterBroadcastReceiver() {
try {
unregisterReceiver(barcodeReceiver)
Log.d(TAG, "Broadcast receiver unregistered")
} catch (e: Exception) {
Log.e(TAG, "Error unregistering receiver: ${e.message}")
}
}
private fun sendBarcodeToFlutter(barcode: String) {
if (::eventSink.isInitialized) {
Log.d(TAG, "Sending barcode to Flutter: $barcode")
eventSink.success(mapOf("barcode" to barcode))
}
}
override fun onDestroy() {
super.onDestroy()
// Ensure broadcast receiver is unregistered
try {
unregisterBroadcastReceiver()
} catch (e: Exception) {
// Ignore if already unregistered
}
}
}
C:\projects_rust\sgbstock\sgbstock\android\app\src\main\kotlin\com\sgbstock\sgbstock\BarcodeBroadcastReceiver.kt
package com.sgbstock.sgbstock
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.util.Log
class BarcodeBroadcastReceiver(private val callback: (String) -> Unit) : BroadcastReceiver() {
companion object {
private const val TAG = "BarcodeBroadcastReceiver"
// Common broadcast actions for barcode scanners
private val ACTIONS = arrayOf(
"com.android.decodewedge.decode_action",
"com.symbol.datawedge.api.NOTIFICATION_ACTION",
"com.zebra.scan.service.BARCODE_DECODED",
"com.sunmi.scanner.ACTION_DATA_CODE_RECEIVED",
"com.xcheng.scanner.action.BARCODE_DECODING_BROADCAST"
)
}
override fun onReceive(context: Context, intent: Intent) {
val action = intent.action
Log.d(TAG, "Received broadcast: $action")
// Try to extract barcode from common intent extras
val barcode = extractBarcode(intent)
if (barcode.isNotEmpty()) {
Log.d(TAG, "Extracted barcode: $barcode")
callback(barcode)
}
}
private fun extractBarcode(intent: Intent): String {
// Try common extra keys for barcode data
val extras = intent.extras
if (extras != null) {
// Common keys for barcode data
val barcodeKeys = arrayOf(
"com.android.decode.intentwedge.barcode_string",
"com.android.decode.intentwedge.barcode_data",
"com.symbol.datawedge.data_string",
"com.zebra.scan.service.BARCODE",
"data",
"source_byte",
"EXTRA_BARCODE_DECODING_DATA"
)
for (key in barcodeKeys) {
val value = extras.getString(key)
if (value != null && value.isNotEmpty()) {
return value
}
}
// Also try getStringExtra directly
for (key in barcodeKeys) {
val value = intent.getStringExtra(key)
if (value != null && value.isNotEmpty()) {
return value
}
}
}
return ""
}
}
浙公网安备 33010602011771号