我想通过扫描包含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过滤器,但没有运气:
<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
意图吗?
答案 0 :(得分:1)
我通过在mimeType
中设置自定义intent-filter
来实现它,就像这样:
<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,根据我的理解,AAR在应用程序级别(而不是在活动级别)工作,并确保只能启动我的应用程序。但我想像这样的自定义MIME类型就足够了。
答案 1 :(得分:1)
除了Android应用程序记录(AAR)之外,执行此操作的典型方法是向标记添加另一条记录(MIME类型,NFC论坛外部类型或URI)。在这种情况下,AAR必须是标签上NDEF消息的最后一个(或至少不是第一个)记录。
然后,您可以使用NDEF_DISCOVERED
意图过滤器过滤该特定数据类型(即标记上NDEF消息的第一条记录的类型)来捕获标记发现。例如。对于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
意图过滤器注册任何活动,则AAR将导致第一个具有MAIN
/ LAUNCHER
意图过滤器的活动(在这种情况下Android获胜)虽然没有把标签的句柄传递给你的活动。因此,如果您既没有注册NDEF_DISCOVERED
意图也没有注册MAIN
/ LAUNCHER
意图,那么AAR机制将不起作用。
但是,如果您希望仅 标记包含AAR且没有其他记录,该怎么办?
您可以通过为AAR本身注册一个意图过滤器来完成此操作。 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>