【问题标题】:Android NFC Intents are not starting my activityAndroid NFC Intents 没有开始我的活动
【发布时间】:2012-06-17 21:11:56
【问题描述】:

我正在尝试编写一个简单的应用程序来与 NFC 标签交互,但我似乎无法让我的手机执行任何操作,只能触发默认的 NFC 标签应用程序。我真的只是想能够拦截我扫描的任何标签,确定它是否有一些数据,并采取相应的行动。

现在我的清单文件看起来像

<uses-sdk android:minSdkVersion="10" />
<uses-feature android:name="android.hardware.nfc" android:required="true"/>
<uses-permission android:name="android.permission.NFC"/>

<application 
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <activity
        android:name=".NfcActivity"
        android:label="@string/app_name">
        <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"/>
        </intent-filter>
    </activity>
</application>

但是,在扫描 NFC 标签时,我从未看到活动开始。我在这里错过了什么吗?我尝试将意图过滤器放在BroadcastReceiver 中,但也没有运气......

【问题讨论】:

    标签: android android-intent nfc


    【解决方案1】:

    您无法通过扫描的所有 NFC 标签启动您的应用。 Android 将根据意图过滤器的具体程度来确定最合适的应用程序。但是,如果您的应用在前台运行,您可以使用NFC foreground dispatch 捕获所有 NFC 意图。

    onCreate() 中添加:

    mAdapter = NfcAdapter.getDefaultAdapter(this);
    PendingIntent pendingIntent = PendingIntent.getActivity(
      this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
    

    onResume() 中添加:

    mAdapter.enableForegroundDispatch(this, pendingIntent, null, null);
    

    onPause() 中添加:

    mAdapter.disableForegroundDispatch(this);
    

    onNewIntent 中,您可以像这样获取 NFC 标签:

    Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
    

    【讨论】:

    • NFC 的理念是它可以做一些事情,例如在您的手机上自动执行适当的操作。一些示例:在浏览器中打开 URL,登录 Foursquare,自动连接 Wifi 网络。 Android 根据应用的意图过滤器确定将 NFC 意图转发到哪个应用。最具体的过滤器“获胜”。如果找到多个匹配项,则会向用户呈现一个应用选择器。有一个例外:NFC 前台调度,在前台运行的应用可以请求获取特定类型的所有 NFC 意图。
    • 我想我只是不明白为什么这是选择的功能,不像 SMS 中的意图可以被任意数量的接收者接收和转播。在与 NFC 技术的交互中,您仅限于采取一项行动,这似乎很愚蠢。
    • 一个区别是 NFC 意图与连接的 NFC 设备相关联,例如 NFC 标签。一次只能与一个活动通信; NFC 标签不支持多个同时连接。
    【解决方案2】:

    SDK 文档将此作为一个基本示例。

    <intent-filter>
        <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain" />
    </intent-filter>
    

    【讨论】:

    • 请注意上面示例中的category 元素。这确实是必要的(尽管名称“DEFAULT”另有说明)。
    • 你能告诉我我可以根据不同的 NFC 标签启动不同的活动吗? tag1/prod/234 或 tag3/buyme/3422 。如果有 prod,我想触发 ProductionInfo 活动,但是对于 buyme,我想加入一个列表,
    【解决方案3】:

    您希望标签以 NDEF 格式定义。所以你的程序只有在被读取的标签是 NDEF 格式时才会启动。

    您可以尝试更通用的意图过滤器,例如 TAG_DISCOVERED 或 TECH_DISCOVERED。

    【讨论】:

      【解决方案4】:

      Android 会自动选择最相关的应用程序来处理扫描的 NFC 标签。您需要在intent-filter 中更具体,即只收听 TEXT-Tags、URL-Tags 或 CONTACT-Tags。这可以通过进一步指定过滤器来完成,使用您的示例,&lt;data android:mimeType="text/plain" /&gt; 用于 TEXT-Tags。否则,将触发默认的 NFC-Tag 应用。

      【讨论】:

        猜你喜欢
        • 2012-10-17
        • 2015-06-04
        • 1970-01-01
        • 2014-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多