如何通过扫描 NFC 标签启动没有启动器图标的应用程序?

3
我希望通过扫描包含Android应用记录的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意图吗?


你有检查过这个链接吗:点击这里 - Pankaj
@Clairvoyant 是的,那就是我在问题中提到的链接。但它并没有解释清楚在清单文件中 activity 应该包含什么内容才能使 AAR 正常工作。 - Bruno Parmentier
你确定这是可能的吗?一个无法从启动器启动的应用听起来像是系统会阻止你这样做。也许你可以检查所需的数据,如果没有,弹出一个有用的消息给用户并调用 finish() - nasch
你的标签包含哪些数据?只有AAR还是还包括其他NDEF记录? - Michael Roland
@MichaelRoland 只需要 AAR(我用 NdefRecord.createApplicationRecord("app.my") 编写的)。 - Bruno Parmentier
2个回答

1
典型的做法是在标签上添加另一条记录(MIME类型、NFC Forum外部类型或URI),除了Android应用记录(AAR)以外。在这种情况下,AAR必须是NDEF消息上的最后一条记录(或至少不是第一条记录)。
然后,您可以通过使用“NDEF_DISCOVERED”意图过滤器来捕获标签发现,并筛选特定数据类型(即您的标签上NDEF消息的第一条记录的类型)。例如,对于NFC Forum外部类型:
<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 Store。
如果您没有为匹配的NDEF_DISCOVERED意图过滤器注册任何活动,则AAR将导致具有MAIN/LAUNCHER意图过滤器的第一个活动(在这种情况下,Android不会将标签的处理程序传递给您的活动)。因此,如果您既不注册NDEF_DISCOVERED意图也不注册MAIN/LAUNCHER意图,则AAR机制将无法工作。
但是,如果您希望您的标签仅包含AAR而没有其他记录该怎么办?
您可以通过为AAR本身注册意图过滤器来实现此目的。 AAR是具有类型名称“urn:nfc:ext:android.com:pkg”的NFC Forum外部类型,因此您可以使用以下意图过滤器:
<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>

1

我通过在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,根据我理解,AAR在应用程序级别上工作(而不是活动级别),并确保只有我的应用程序可以启动。但我猜这样的自定义MIME类型已经足够好了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接