Android Beam:使用MIME类型记录启动应用程序



我正在做一个项目,我使用Android智能手机和PN532 USB芯片(elechouse),该芯片具有点对点模式作为其功能之一。我试图从PN532模块发送NDEF消息到智能手机,相反,它工作得很好。

我想要的是当PN532模块找到智能手机时,我的应用程序会自动启动。

我知道一个解决方案是使用MIME类型记录。

我在清单中有这个:

 <data android:mimeType="application/vnd.test.com.openapp"/>

在模块方面,我可以传输MIME,但我不知道这个MIME必须是什么形式。我试图传输字符串,但没有任何反应。

那么我如何在我的模块上创建MIME类型记录?是否有其他方式通过点对点通信启动我的应用程序?

首先,您必须实现点对点协议堆栈:

+--------------------------------------+
|   NDEF (NFC Data Exchange Format)    |
+--------------------------------------+
| SNEP (Simple NDEF Exchange Protocol) |
+--------------------------------------+
| LLCP (Logical Link Control Protocol) |
+--------------------------------------+
|               NFCIP-1                |
+--------------------------------------+

你似乎已经启动并运行了,因为你表明你"试图从PN532模块发送NDEF消息到智能手机,相反,它工作得很好。"

因此,接下来您需要创建一个带有MIME类型记录(或者更好的是NFC论坛外部类型记录)的NDEF消息作为其第一个记录。为了使用Android的AAR (Android Application Record)功能将NDEF消息绑定到你的应用程序(应用程序要么启动,要么如果没有安装,你的应用程序的Play Store页面被打开),你可以在NDEF消息的末尾添加一个AAR。

只包含MIME类型记录的NDEF消息:

+------+------+------+------+------+--------------------------+
| MB=1 | ME=1 | CF=0 | SR=1 | IL=0 | TNF=2 (MIME type record) |
+------+------+------+------+------+--------------------------+
| TYPE LENGTH=32 (0x20)                                       |
+-------------------------------------------------------------+
| PAYLOAD LENGTH=5 (0x05)                                     |
+-------------------------------------------------------------+
| TYPE="application/vnd.test.com.openapp"                     |
+-------------------------------------------------------------+
| PAYLOAD="Hello"                                             |
+-------------------------------------------------------------+

作为字节数组,它看起来像

{
    /* Header byte    */ 0xD2,
    /* TYPE LENGTH    */ 0x20,
    /* PAYLOAD LENGTH */ 0x05,
    /* TYPE           */ 0x61, 0x70, 0x70, 0x6C, 0x69, 0x63, 0x61, 0x74,
                         0x69, 0x6F, 0x6E, 0x2F, 0x76, 0x6E, 0x64, 0x2E,
                         0x74, 0x65, 0x73, 0x74, 0x2E, 0x63, 0x6F, 0x6D,
                         0x2E, 0x6F, 0x70, 0x65, 0x6E, 0x61, 0x70, 0x70,
    /* PAYLOAD        */ 0x48, 0x65, 0x6C, 0x6C, 0x6F
}

然后你可以在你的manifest中使用intent过滤器来注册你的应用程序:

<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="application/vnd.test.com.openapp" />
</intent-filter>    

对于AAR变体,您可以将应用程序的AAR附加到该消息中。例如,如果你的应用程序的包名为"com.your.app.package":

+------+------+------+------+------+--------------------------+
| MB=1 | ME=0 | CF=0 | SR=1 | IL=0 | TNF=2 (MIME type record) |
+------+------+------+------+------+--------------------------+
| TYPE LENGTH=32 (0x20)                                       |
+-------------------------------------------------------------+
| PAYLOAD LENGTH=5 (0x05)                                     |
+-------------------------------------------------------------+
| TYPE="application/vnd.test.com.openapp"                     |
+-------------------------------------------------------------+
| PAYLOAD="Hello"                                             |
+-------------------------------------------------------------+
+------+------+------+------+------+--------------------------+
| MB=0 | ME=1 | CF=0 | SR=1 | IL=0 | TNF=4 (External type)    |
+------+------+------+------+------+--------------------------+
| TYPE LENGTH=15 (0x0F)                                       |
+-------------------------------------------------------------+
| PAYLOAD LENGTH=20 (0x14)                                    |
+-------------------------------------------------------------+
| TYPE="android.com:pkg"                                      |
+-------------------------------------------------------------+
| PAYLOAD="com.your.app.package"                              |
+-------------------------------------------------------------+

作为字节数组,它看起来像

{
    /* MIME type record */
    /* Header byte    */ 0x92,
    /* TYPE LENGTH    */ 0x20,
    /* PAYLOAD LENGTH */ 0x05,
    /* TYPE           */ 0x61, 0x70, 0x70, 0x6C, 0x69, 0x63, 0x61, 0x74,
                         0x69, 0x6F, 0x6E, 0x2F, 0x76, 0x6E, 0x64, 0x2E,
                         0x74, 0x65, 0x73, 0x74, 0x2E, 0x63, 0x6F, 0x6D,
                         0x2E, 0x6F, 0x70, 0x65, 0x6E, 0x61, 0x70, 0x70,
    /* PAYLOAD        */ 0x48, 0x65, 0x6C, 0x6C, 0x6F,
    /* Android Application Record */
    /* Header byte    */ 0x54,
    /* TYPE LENGTH    */ 0x0F,
    /* PAYLOAD LENGTH */ 0x14,
    /* TYPE           */ 0x61, 0x6E, 0x64, 0x72, 0x6F, 0x69, 0x64, 0x2E,
                         0x63, 0x6F, 0x6D, 0x3A, 0x70, 0x6B, 0x67
    /* PAYLOAD        */ 0x63, 0x6F, 0x6D, 0x2E, 0x79, 0x6F, 0x75, 0x72,
                         0x2E, 0x61, 0x70, 0x70, 0x2E, 0x70, 0x61, 0x63,
                         0x6B, 0x61, 0x67, 0x65
}

最新更新