在 flutter 插件类中捕获 onNewIntent()

dre*_*rek 3 android nfc flutter

问题标题可能有点令人困惑。我会尝试解释更多细节。

我正在编写一个 flutter 插件来使用 NFC。

我有示例 Android Activity,它在收到 NDEF 消息时触发 onNewIntent()。此时消息有效负载就可以使用了。

class MainActivity : AppCompatActivity() {
    private var mNfcAdapter: NfcAdapter? = null
    private var mPendingIntent: PendingIntent? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        mNfcAdapter = NfcAdapter.getDefaultAdapter(this)

        mPendingIntent = PendingIntent.getActivity(
                this, 0,
                Intent(this, this.javaClass)
                    .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0
            )
    }

    override fun onResume() {
        super.onResume()
        mNfcAdapter?.enableForegroundDispatch(this, mPendingIntent, null, null)
    }

    override fun onPause() {
        super.onPause()
        mNfcAdapter?.disableForegroundDispatch(this)
    }

    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)
        if (NfcAdapter.ACTION_NDEF_DISCOVERED == intent.action) {
            intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)?.also { rawMessages ->
                val messages: List<NdefMessage> = rawMessages.map { it as NdefMessage }

                parseNDEFMessage(messages)
            }
        }
    }

    private fun parseNDEFMessage(messages: List<NdefMessage>) {
        //do parsing and display payload
    }

Run Code Online (Sandbox Code Playgroud)

我需要在插件类中具有相同的功能。

这是我的插件类

class NfcforflutterPlugin(private var activity: Activity?) : MethodCallHandler, EventChannel.StreamHandler {
  private var mNfcAdapter: NfcAdapter? = null
  private var mPendingIntent: PendingIntent? = null
    private var  mEventSink: EventChannel.EventSink? = null

  companion object {
    @JvmStatic
    fun registerWith(registrar: Registrar) {
        var nfcforflutterPlugin = NfcforflutterPlugin(registrar.activity())
        val channel = MethodChannel(registrar.messenger(), "nfcforflutter")
        channel.setMethodCallHandler(nfcforflutterPlugin)
        val eventChannel = EventChannel(registrar.messenger(), "nfcforflutter")
        eventChannel.setStreamHandler(nfcforflutterPlugin)
    }
  }

  fun getNDEFMessage(): String{
    return "CALLED getNDEFMessage"
  }

  fun initializeNFCReading():Boolean {
    mNfcAdapter = NfcAdapter.getDefaultAdapter(activity)

    if(!checkNFCEnable())
            return false
    val intent = Intent(activity?.applicationContext, activity?.javaClass)
    intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)

    val pendingIntent = PendingIntent.getActivity(activity?.applicationContext, 0, intent, 0)

    mNfcAdapter?.enableForegroundDispatch(activity, pendingIntent, null, null)
        return true
  }

  private fun checkNFCEnable(): Boolean {
    return if (mNfcAdapter == null) {
      false
    } else {
      mNfcAdapter!!.isEnabled
    }
  }

  override fun onMethodCall(call: MethodCall, result: Result) {
    if (call.method == "getPlatformVersion") {
      result.success("Android ${android.os.Build.VERSION.RELEASE}")
      return
    }
    if (call.method == "getNDEFMessage") {
      result.success(getNDEFMessage())
      return
    }
      if (call.method == "initializeNFCReading") {
          result.success(initializeNFCReading())
          return
      }

    result.notImplemented()

  }

  override fun onListen(p0: Any?, eventSink: EventChannel.EventSink?) {
        mEventSink = eventSink
  }

  override fun onCancel(p0: Any?) {
  }
Run Code Online (Sandbox Code Playgroud)

由于NfcforflutterPlugin不是 Activity,我需要像 Android ActivityNfcforflutterPlugin一样在类中触发事件onNewIntent(),该事件将在消息发现时刻被调用,以便我可以运行mEventSink.success(ndefMessage)并将消息传递到 Flutter 端。

任何想法?

Abh*_*iya 6

实现PluginRegistry.NewIntentListener聆听意图方法。检查这里

它有onNewIntent方法。你可以使用它。喜欢,

class NfcforflutterPlugin(private var activity: Activity?) : MethodCallHandler, EventChannel.StreamHandler, PluginRegistry.NewIntentListener {
      ....................
      ....................
      override fun onNewIntent(intent:Intent):Boolean  {
            //handle data with intent
        return false;
     }
}
Run Code Online (Sandbox Code Playgroud)