当前位置: 首页 > 知识库问答 >
问题:

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

严锐
2023-03-14

我想通过扫描包含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>

我应该怎么做才能让它工作?我应该在Mainactive中添加代码来处理NDEF_DISCOVERED意图吗?

共有2个答案

谢哲瀚
2023-03-14

我通过在意图过滤器中设置一个自定义的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>

然后创建一个NdeFRESTER来写在标签上:

NdefRecord.createMime("application/vnd.app.my", null);

这并没有利用AAR,据我所知,AAR在应用程序级别(而不是活动级别)工作,并确保只有我的应用程序可以启动。但我想像这样的自定义MIME类型已经足够好了。

朱宏爽
2023-03-14

实现这一点的典型方法是,除了Android应用程序记录(AAR)之外,向标记中添加另一个记录(MIME类型、NFC论坛外部类型或URI)。在这种情况下,AAR必须是标签上NDEF消息的最后一条(或至少不是第一条)记录。

然后,您可以通过使用NDEF_DISCOVEREDintent过滤器过滤特定数据类型(即标签上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 Store。

如果您没有为匹配的NDEF_DISCOVERED意图过滤器注册任何活动,AAR将导致第一个具有MAIN/LAUNCHER意图过滤器的活动(在这种情况下,Android不会将标记的句柄传递给您的活动)。因此,如果您既不注册NDEF_DISCOVERED意图,也不注册MAIN/LAUNCHER意图,则AAR机制将无法工作。

但是,如果您希望您的标记只包含AAR而不包含其他记录,该怎么办?

您可以通过为AAR本身注册意图过滤器来实现这一点。AAR是NFC论坛外部类型,类型名称为“urn: nfc: ext:android.com: pkg”,因此您可以使用以下意图过滤器:

<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应用程序,以发送给一些测试人员。但是,我遇到了一个问题。当您退出应用程序,然后通过其图标启动它重新进入它时,它会重新启动整个应用程序,而不是返回到其以前的位置。即使您在退出后立即重新进入,也会发生这种情况。但是,如果我按住主屏幕按钮并通过最近的应用程序列表启动它,则不会发生这种情况。 我在网上搜索过其他有这个问题的人,只有少数人,但没有人能确切回答为什么会发生

  • 您可以通过Burp 控制台(Burp Dashboard)上的新的扫描(New scan)按钮或是 Burp 中出现的菜单中的Scan选项来启动扫描。利用这些方法可打开扫描启动窗口,然后您可以使用它配置扫描中的各种详细参数。 扫描细节 扫描启动界面的详细的扫描信息(Scan details)部分允许您选择扫描类型,配置要扫描的内容等等信息。 扫描类型 您可以选择以下扫描类型: 抓取并审计(Craw

  • 当我使用命令创建应用程序时,flutter徽标用作两个平台的应用程序图标。 如果我想更改应用程序图标,我是否应该同时转到两个平台目录并替换那里的图像呢?对于平台目录,我指的是iOS的和Android的。 或者有可能将一个图像定义为Flutter资产,图标以某种方式生成?。

  • 我已经建立了apk和安装后没有图标在启动器。应用程序工作正常,我可以用adb启动活动。但为什么应用程序在启动器中没有图标,我不明白。 似乎我看到了问题的原因。如果我尝试使用adb“adb shell am start mypackagename”启动我的应用程序,我会收到错误: 活动未启动,无法解析Intent{act=android.intent.action.MAIN cat=[android

  • 我发现Android应用程序非常奇怪的错误,而在Android设备中安装应用程序时具有给定的流程。 > 已从Play商店(旧版)安装该应用程序。 启动应用程序(现在我在主屏幕上,即< code>HomeActivity)。 现在,我通过安装最新版本(正在生产版本,尚未发布到playstore)升级了应用程序。 单击启动器图标,等待主屏幕显示,然后按菜单按钮将应用程序置于后台。 现在,单击启动器图标

  • 我有一个spring启动应用程序,我需要通过进入文件夹目录并通过命令行启动我的web应用程序来启动它。我有一门课叫应用。java及其内部代码如下所示。 我设置了类路径,然后试图运行命令"",但我得到了这个错误消息""