与广播接收者一起收到的Android NFC标签

z_z*_*z_z 7 android nfc broadcastreceiver

我试图在广播接收器中捕获NFC标签,所以我写了一个简单的BR,在onReceive()中打印"asd".在清单xml中,它被描述为:

我只收到这个,根本没有印刷品....

01-31 16:37:18.980: ERROR/MediaPlayer(990): setAudioStream called in state 8
01-31 16:37:18.980: ERROR/MediaPlayer(990): error (-38, 0)
01-31 16:37:18.980: ERROR/MediaPlayer(990): start called in state 0
01-31 16:37:18.980: ERROR/MediaPlayer(990): error (-38, 0)
01-31 16:37:18.988: ERROR/MediaPlayer(990): Error (-38,0)
Run Code Online (Sandbox Code Playgroud)

当我使用activity来处理这样的意图时:

<activity android:name="TagViewer"
            android:theme="@android:style/Theme.NoTitleBar">
            <intent-filter>
                <action android:name="android.nfc.action.TAG_DISCOVERED"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
</activity>
Run Code Online (Sandbox Code Playgroud)

活动已启动且运行正常,那么如何使其与BroadcastReceiver一起使用?

Dav*_*ean 9

你不能.正如您所指出的,NFC适配器正在使用与startActivity()非常相似的东西来发送带有标记信息的意图.它与我们在Android SDK中的功能不完全相同,因为NFC标签很特别.例如,除了TAG_DISCOVERED之外,你不能自己模拟startActivity(),这是最后的手段,并不是非常有用.

我认为这是因为NFC意图的特殊处理.当NFC硬件发现标签时,它会寻找能够处理标签的东西.前景活动首先尝试.如果可以,它会尝试下一个NDEF_DISCOVERED意图,并寻找一个活动来接受它.如果找不到,则尝试使用TECH_DISCOVERED.同样,如果找不到任何活动,它最终会尝试TAG_DISCOVERED.如果它使用广播,它怎么能做这个后备逻辑继续尝试找到处理标签的东西?如何知道是否有任何行为对标签意图?它怎么能确保只有一件事会对标签起作用?


And*_*zie 9

您可以编写一个根本不显示任何UI的小活动,发送广播消息,然后以finish()结束.使用清单中的标记可以避免它出现在历史记录或最近的状态中并且很快隐形,希望能够获得与您想要的广播接收器类似的效果.