Android Beam:启动带有 MIME 类型记录的应用程序
Android Beam: launch application with MIME type record
我正在做一个项目,我正在使用 Android 智能手机和 PN532 USB 芯片(elechouse),它具有点对点模式作为其功能之一。我尝试将 NDEF 消息从 PN532 模块发送到智能手机,反之,它工作正常。
我想要的是当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 |
+--------------------------------------+
您似乎已经准备好了,运行,因为您指出您“尝试将 NDEF 消息从 PN532 模块发送到智能手机,反之,它工作正常。"
因此,接下来您需要创建一个 NDEF 消息,其中包含 MIME 类型记录(或者更好的 NFC 论坛外部类型记录)作为其 first 记录。为了使用 Android 的 AAR(Android 应用程序记录)工具将 NDEF 消息绑定到 仅 您的应用程序(应用程序已启动,或者,如果没有安装后,您的应用程序的 Play 商店页面已打开),您还可以在 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
}
然后您可以在您的清单中使用像这样的 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
}
我正在做一个项目,我正在使用 Android 智能手机和 PN532 USB 芯片(elechouse),它具有点对点模式作为其功能之一。我尝试将 NDEF 消息从 PN532 模块发送到智能手机,反之,它工作正常。
我想要的是当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 |
+--------------------------------------+
您似乎已经准备好了,运行,因为您指出您“尝试将 NDEF 消息从 PN532 模块发送到智能手机,反之,它工作正常。"
因此,接下来您需要创建一个 NDEF 消息,其中包含 MIME 类型记录(或者更好的 NFC 论坛外部类型记录)作为其 first 记录。为了使用 Android 的 AAR(Android 应用程序记录)工具将 NDEF 消息绑定到 仅 您的应用程序(应用程序已启动,或者,如果没有安装后,您的应用程序的 Play 商店页面已打开),您还可以在 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
}
然后您可以在您的清单中使用像这样的 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
}