如何通过扫描 NFC 标签启动没有启动器图标的应用程序?
How to launch an app without launcher icon by scanning an NFC tag?
我想通过扫描包含 Android Application Record 的 NFC 标签来启动我的应用程序。但是,这个应用程序不应该有启动器图标,所以我不能使用 CATEGORY_LAUNCHER
。
我的问题是,如果我在清单中注释掉 CATEGORY_LAUNCHER
行,应用程序将不再启动(在 Google Play 上执行搜索):
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="app.my">
<application android:label="@string/app_name">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<!--<category android:name="android.intent.category.LAUNCHER" />-->
</intent-filter>
</activity>
</application>
</manifest>
我也尝试添加以下意图过滤器,但没有成功:
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
我应该怎么做才能让它发挥作用?我应该在 MainActivity
中添加代码来处理 NDEF_DISCOVERED
意图吗?
我通过在 intent-filter
中设置自定义 mimeType
使其正常工作,如下所示:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="app.my">
<application android:label="@string/app_name">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<!--<category android:name="android.intent.category.LAUNCHER" />-->
</intent-filter>
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="application/vnd.app.my" />
</intent-filter>
</activity>
</application>
</manifest>
然后创建一个 NdefRecord
以在标签上写入:
NdefRecord.createMime("application/vnd.app.my", null);
这没有利用 AAR,据我所知,它在应用程序级别(而不是 activity 级别)工作,并确保只能启动我的应用程序。但我想像这样的自定义 MIME 类型就足够了。
执行此操作的典型方法是在 Android 应用程序记录 (AAR) 之外向标签添加另一条记录(MIME 类型、NFC 论坛外部类型或 URI)。在这种情况下,AAR 必须是标签上 NDEF 消息的最后(或至少不是第一个)记录。
然后您可以通过使用 NDEF_DISCOVERED
意图过滤器。例如。对于 NFC 论坛外部类型:
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="vnd.android.nfc"
android:host="ext"
android:pathPrefix="/yourdomain.com:yourtypename"/>
</intent-filter>
</activity>
在这种情况下,AAR 将确保您的应用程序优先于注册相同类型的任何其他应用程序,并且如果您的应用程序尚未安装,Play 商店会为您打开。
如果您没有为匹配的 NDEF_DISCOVERED
意图过滤器注册任何 activity,AAR 将导致第一个 activity 具有 MAIN
/LAUNCHER
意图过滤器(在这种情况下 Android 不会将标记的句柄传递给您的 activity)。因此,如果您既不注册 NDEF_DISCOVERED
意图也不注册 MAIN
/LAUNCHER
意图,则 AAR 机制将不起作用。
但是如果您希望您的标签仅包含一个 AAR 而没有其他记录怎么办?
您可以通过为 AAR 本身注册一个 intent 过滤器来做到这一点。 AAR 是 NFC 论坛外部类型,类型名称为 "urn:nfc:ext:android.com:pkg",因此您可以使用以下 Intent 过滤器:
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="vnd.android.nfc" android:host="ext"
android:pathPrefix="/android.com:pkg" />
</intent-filter>
我想通过扫描包含 Android Application Record 的 NFC 标签来启动我的应用程序。但是,这个应用程序不应该有启动器图标,所以我不能使用 CATEGORY_LAUNCHER
。
我的问题是,如果我在清单中注释掉 CATEGORY_LAUNCHER
行,应用程序将不再启动(在 Google Play 上执行搜索):
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="app.my">
<application android:label="@string/app_name">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<!--<category android:name="android.intent.category.LAUNCHER" />-->
</intent-filter>
</activity>
</application>
</manifest>
我也尝试添加以下意图过滤器,但没有成功:
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
我应该怎么做才能让它发挥作用?我应该在 MainActivity
中添加代码来处理 NDEF_DISCOVERED
意图吗?
我通过在 intent-filter
中设置自定义 mimeType
使其正常工作,如下所示:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="app.my">
<application android:label="@string/app_name">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<!--<category android:name="android.intent.category.LAUNCHER" />-->
</intent-filter>
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="application/vnd.app.my" />
</intent-filter>
</activity>
</application>
</manifest>
然后创建一个 NdefRecord
以在标签上写入:
NdefRecord.createMime("application/vnd.app.my", null);
这没有利用 AAR,据我所知,它在应用程序级别(而不是 activity 级别)工作,并确保只能启动我的应用程序。但我想像这样的自定义 MIME 类型就足够了。
执行此操作的典型方法是在 Android 应用程序记录 (AAR) 之外向标签添加另一条记录(MIME 类型、NFC 论坛外部类型或 URI)。在这种情况下,AAR 必须是标签上 NDEF 消息的最后(或至少不是第一个)记录。
然后您可以通过使用 NDEF_DISCOVERED
意图过滤器。例如。对于 NFC 论坛外部类型:
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="vnd.android.nfc"
android:host="ext"
android:pathPrefix="/yourdomain.com:yourtypename"/>
</intent-filter>
</activity>
在这种情况下,AAR 将确保您的应用程序优先于注册相同类型的任何其他应用程序,并且如果您的应用程序尚未安装,Play 商店会为您打开。
如果您没有为匹配的 NDEF_DISCOVERED
意图过滤器注册任何 activity,AAR 将导致第一个 activity 具有 MAIN
/LAUNCHER
意图过滤器(在这种情况下 Android 不会将标记的句柄传递给您的 activity)。因此,如果您既不注册 NDEF_DISCOVERED
意图也不注册 MAIN
/LAUNCHER
意图,则 AAR 机制将不起作用。
但是如果您希望您的标签仅包含一个 AAR 而没有其他记录怎么办?
您可以通过为 AAR 本身注册一个 intent 过滤器来做到这一点。 AAR 是 NFC 论坛外部类型,类型名称为 "urn:nfc:ext:android.com:pkg",因此您可以使用以下 Intent 过滤器:
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="vnd.android.nfc" android:host="ext"
android:pathPrefix="/android.com:pkg" />
</intent-filter>