适配扫描枪

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

  

posted @ 2026-04-09 09:22  CrossPython  阅读(4)  评论(0)    收藏  举报