当前位置: 首页 > 知识库问答 >
问题:

Android NFC应用程序不推送Ndef消息

万俟浩
2023-03-14

我正在开发一个Android应用程序,它使用NFC来注册设备间的触摸。我正在使用两个Nexus 7进行测试

理想的用例是让应用程序在一个设备上处于活动状态,而不是在另一个设备上处于活动状态。主动设备推送一个包含一些数据的记录的NDefMessage,供被动设备应用处理。被动设备将包含一些数据的记录传回主动应用。

我在清单中设置了以下意图过滤器:

  <activity android:name=".MainActivity" android:label="@string/title_activity_main">
        <intent-filter>
          <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
          <data android:mimeType="application/com.killerapprejji.MainActivity"/>
          <data android:mimeType="application/com.*"/>
          <data android:mimeType="application/com.killerapprejji.*"/>
          <data android:mimeType="application/*"/>
          <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
  </activity>

在我的主要活动中,我在onCreate中设置了以下NFC适配器:

mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
PendingIntent pendingIntent = PendingIntent.getActivity(
            this, 0, new Intent(this,
                getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
mNfcPendingIntent = pendingIntent;
    // Intent filters for exchanging over p2p.
if(mNfcAdapter != null){
    IntentFilter ndefDetected = new
                       IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
    IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
    try {
        ndef.addDataType("application/*");    
    }
    catch (MalformedMimeTypeException e) {
        throw new RuntimeException("fail", e);
    }
    this.intentFiltersArray = new IntentFilter[] {ndef, };
    Log.d(this.toString(), "mNfcPendingIntent: ");
    mNdefExchangeFilters = new IntentFilter[] { ndefDetected,defendDetected };

}

我为onNewIntent准备了以下内容:

protected void onNewIntent(Intent intent) {
    // NDEF exchange mode
    Log.d("onNewIntent", intent.getAction());
    if (NfcAdapter.ACTION_NDEF_DISCOVERED == (intent.getAction())) {
        NdefMessage[] msgs = getNdefMessages(intent);
        for(int i = 0; i < msgs.length; i++){
            Log.d("onNewIntent", "found new NdefMessage");
        }
     }

    finish();
}

现在,我打这个电话:

public void setIdleMessage(){
    InteractionHistory intHist = InteractionHistory.getInstance();
    NdefMessage attackNdefMessage = null;
    NdefRecord[] ndefRecords = new NdefRecord[10];
    ndefRecords[0] = NdefRecord.createMime("application/com.killerapprejji.NfcHandle", new String("attack,attacker:"
            + intHist.getDisplayName() 
            + ",attackerid:" + "1").getBytes());
    attackNdefMessage = new NdefMessage(ndefRecords[0]);
    // need to come up with a way to end if the above try/catch fails
    mNfcAdapter.setNdefPushMessage(attackNdefMessage, this);
}

期望它设置NDefPushMessage。每当我触摸将两个设备置于NFC范围内时,我仍然只能获得可选的“触摸到光束”界面。

关于我怎样才能理解这些意图,或者我的NdefMessage是否像我预期的那样被发送,有什么想法吗?

共有1个答案

琴镜
2023-03-14

“Touch to Beam”消息,是谷歌定义的一条推送NDEF消息的消息,您希望在setNdefPushMessage上共享该消息,因此在您推送该屏幕之前,不会向其他设备发送任何信息。

事实上,你从Android中使用的API被称为Android BEAM

另一种方式是,如果一台设备正在推送NDEF消息,则在您停止推送之前,它无法接收消息,因此您必须实现NDefPushCallback以捕获成功发送的NDEF消息,停止推送第一台设备,然后它将能够从另一台设备接收新的意图(已接收NDEF消息)

我建议您首先使用URI mime类型或纯文本(一些简单的东西)来制作一个测试应用程序,以确保您的“共享逻辑”正常。确认后,可以回滚到自己的mime类型

 类似资料:
  • 我正在iOS8+上使用最新的试用版PubNub,Xcode7.3,试图建立一个聊天应用程序。我正在评估PubNub作为另一个聊天服务器的替代方案。 我遵循了PubNub文档中关于苹果推送通知的说明,但我的应用程序在后台时从不接收推送通知。 我已经创建了p12证书并将其导入到PubNub密钥集中。我在Xcode常规设置中启用了推送通知。我已经编写了PubNub文档中指定的Swift代码。我能够成功发

  • 我已经完成了关于如何使用Django(3.1.7版)中的频道和redis制作即时聊天应用程序的youtube教程(github代码链接)。我确实改变了教程中的一些内容,因为他使用的是不同的Django版本。我在使用他的代码时遇到的错误在另一篇stackoverflow文章中有解释。 我已将邮件保存到数据库,并已成功加载页面加载上的10条最新邮件。但是,当我单击“发送”按钮时,我没有看到消息显示在消

  • 有可能截获所有的GCM消息吗?

  • 我已经得到推送通知工作,并设法更新图标徽章计数时,应用程序被带到前台。 但我对此有点困惑。。。iPhone收到通知,弹出消息显示激活我的应用程序,徽章仅在我启动应用程序后更新。 就用户体验而言,这听起来并不正确。我的理解是,徽章计数应该通过递增计数通知用户需要采取的行动,但这要等到应用程序运行的后期才会发生。 那么,当应用程序在后台收到推送通知时,有没有办法告诉它更新徽章计数? 请注意,我的应用程

  • 我是flutter的新手,我只是试图接收firebase推送通知到我的flutter应用程序。当应用程序关闭时,在后台接收推送通知。但是当应用程序打开时,推送通知正在接收,但它不显示警报通知(如果它打开了,我想在我的应用程序中显示推送通知的标题和正文作为警报)。这是我的代码。 谁能帮我做这个吗?

  • 我在React原生iOS应用程序中使用OneSignal,我需要访问应用程序是否从推送通知启动,如果是,我需要推送负载。 我没有在OneSignal文档中看到任何东西。以下是我的代码(立即在app constructor调用): 功能触发正常,如果应用程序已经运行,也能正常工作。如果应用程序是通过点击推送通知启动的,则不调用该功能。我需要处理这种情况,因为我需要将推送有效载荷与动作进行深度链接。