Zebra Datawedge вне основного действия. Как настроить фильтр намерений?

Новичок в Android и Kotlin, и мне нужна помощь с намерениями и фильтрами намерений. Я использую Zebra MC2700 с Android Studio 2021 и Kotlin. Мое основное действие настраивает профиль DataWedge, а затем запускает другое действие. Второе действие должно иметь фильтр намерений, чтобы я мог использовать onNewIntent. Этот процесс хорошо продемонстрирован в этом руководстве https://github.com/darryncampbell/DataWedge-GettingStarted-Samples . Мне удалось продублировать и изменить это приложение. Но я не могу заставить свою процедуру OnIntent вызываться в чем-либо, кроме основного действия.

Я также прочитал тему «Использование DataWedge для нескольких действий на сканере штрих-кода Zebra не работает в Котлине», но я все еще что-то упускаю. Конечно, это связано с манифестом Android и настройкой Intent Filter / Listener.

Файл DWUtilities.kt такой же, как в примере, за исключением действия фильтра:

              intentProps.putString(
            "intent_action",
              "com.example.simplescan.ACTION")

В моем основном действии есть кнопка, которая запускает второе действие.

                          val intent = Intent(this, SubActivityConsume::class.java)
                    startActivity(intent)

Это второе действие, в котором должно выполняться сканирование:

      class SubActivityConsume : AppCompatActivity(), View.OnTouchListener{

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_sub_consume)
        val btnScan = findViewById<Button>(R.id.btnScan)
        btnScan.setOnTouchListener(this)
    }

// Zebra DataWedge Stuff
override fun onNewIntent(intent: Intent) {
    super.onNewIntent(intent)
    displayScanResult(intent)
}

и вот мой последний манифест Android (отредактировано, чтобы иметь весь файл .xml на случай, если есть другие проблемы, которые мне не хватает)

      <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.simplescan">

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.SimpleScan">
        <activity
            android:name=".ViewLists"
            android:exported="false"
            android:label="View Lists" />
        <activity
            android:name=".SubActivityConsume"
            android:exported="false"
            android:label="Scan Consumed Material"
            android:launchMode="singleTop">
        <intent-filter>
            <action android:name="com.example.simplescan.ACTION" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
        </activity>
        <activity
            android:name=".SubActivityReceive"
            android:exported="false"
            android:label="Scan Received Material" />
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>

</manifest>

И программный триггер, и триггер устройства запускают сканер, он считывает штрих-код и раздается звуковой сигнал. Но onNewIntent() никогда не вызывается.

1 ответ

У меня тоже были проблемы с этим; способ, которым я заработал, заключался в том, чтобы установить для профиля Broadcast Intent и установить BroadcastReceiver в действии, которое в нем нуждается.

В DWUtilities.kt измените

      intentProps.putString("intent_delivery", "0") //  StartActivity

к

      intentProps.putString("intent_delivery", "2") //  Broadcast Intent

Затем в SubActivityConsume.kt настройте свой широковещательный приемник...

      class SubActivityConsume : AppCompatActivity(), View.OnTouchListener{
        lateinit var broadcastReceiver: BroadcastRecevier
            
                override fun onCreate(savedInstanceState: Bundle?) {
                    super.onCreate(savedInstanceState)
                    setContentView(R.layout.activity_sub_consume)
                    val btnScan = findViewById<Button>(R.id.btnScan)
                    btnScan.setOnTouchListener(this)
    
    
                   broadcastReceiver = object : BroadcastReceiver() {
                    override fun onReceive(context: Context, scanIntent: Intent?) {
                        Log.v("SCAN","broadcast received: ${scanIntent?.action}")
                        when (scanIntent?.action) {
                            "com.example.simplescan.ACTION" -> {
                                 displayScanResult(scanIntent)
                            }
                        }
                    }
                }
                DWUtilities.CreateDWProfile(this)
        }

        override fun onResume() {
                super.onResume()
                this.registerReceiver(broadcastReceiver, 
     IntentFilter("com.example.simplescan.ACTION"))
                Log.v("SCAN","Broadcast receiver registered")
            }
        
            override fun onPause() {
                super.onPause()
                this.unregisterReceiver(broadcastReceiver)
                Log.v("SCAN","Broadcast receiver unregistered")
            }
Другие вопросы по тегам