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 端。
任何想法?
实现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)
| 归档时间: |
|
| 查看次数: |
2692 次 |
| 最近记录: |