7

NFC と MIFARE CARD で動作するアプリを作成しています。

NFC デバイスがカードを検出すると、NFC を使用できるアプリケーションのリストが表示されますが、私のアプリケーションは言及されていません。

Android マニフェスト ファイルに何が欠けていますか?

<uses-permission android:name="android.permission.NFC" />

<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="17" />

<uses-feature
    android:name="android.hardware.nfc"
    android:required="true" />

<application
    android:icon="@drawable/ic_launcher"         android:allowBackup="true"
    android:label="@string/app_name" android:theme="@style/AppTheme" >
    <activity android:uiOptions="splitActionBarWhenNarrow" 
        android:name="it.namespace.app.MainActivity"
        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.TECH_DISCOVERED" />
            <action android:name="android.nfc.action.TAG_DISCOVERED" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
     <meta-data
            android:name="android.nfc.action.TECH_DISCOVERED"
            android:resource="@xml/tech_filter" />
    </activity>
</application>

そして、これは私のtech_filterファイルxmlです:

    <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" >

    <tech-list>
        <tech>
android.nfc.tech.MifareClassic
        </tech>
    </tech-list>

</resources>

私のアプリケーションがリストにないことを示す画像は次のとおりです。 ここに画像の説明を入力

4

3 に答える 3

14

私は同じ問題を抱えていました.Androidドキュメントhttp://developer.android.com/guide/topics/connectivity/nfc/nfc.html#tech-discのこの文に基づいて修正しました

「アクティビティが ACTION_TECH_DISCOVERED インテントをフィルター処理する場合、技術リスト セット内でアクティビティがサポートするテクノロジーを指定する XML リソース ファイルを作成する必要があります。技術リスト セットがテクノロジーのサブセットである場合、アクティビティは一致と見なされます。これは、getTechList() を呼び出すことで取得できます。

たとえば、スキャンされたタグが MifareClassic、NdefFormatable、および NfcA をサポートしている場合、アクティビティが一致するためには、tech-list セットで 3 つ、2 つ、または 1 つのテクノロジーすべてを指定する必要があります。」

nfc_tech_list は、現在のタグでサポートされているテクノロジのサブセットを定義する必要があります。

-マニフェストを次のように定義します。

      <intent-filter>
         <action android:name="android.nfc.action.TECH_DISCOVERED"/>
             <category android:name="android.intent.category.DEFAULT" />
       </intent-filter>

       <meta-data android:name="android.nfc.action.TECH_DISCOVERED"
                         android:resource="@xml/nfc_tech_list" /> 

</activity>

-xml nfc_check_list を次のように定義します。

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <tech-list>
        <tech>android.nfc.tech.NdefFormatable</tech>
        <tech>android.nfc.tech.MifareUltralight</tech>
    </tech-list>

    <tech-list>
        <tech>android.nfc.tech.NfcA</tech>
        <tech>android.nfc.tech.Ndef</tech>
    </tech-list>

    <tech-list>
        <tech>android.nfc.tech.NfcB</tech>
        <tech>android.nfc.tech.Ndef</tech>
    </tech-list>
</resources>

これは完全に機能します。

于 2013-07-23T22:32:26.233 に答える
1

tech-list リソースを作成しましたか?

から: http://developer.android.com/guide/topics/connectivity/nfc/nfc.html#tech-disc

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <tech-list>
        <tech>android.nfc.tech.IsoDep</tech>
        <tech>android.nfc.tech.NfcA</tech>
        <tech>android.nfc.tech.NfcB</tech>
        <tech>android.nfc.tech.NfcF</tech>
        <tech>android.nfc.tech.NfcV</tech>
        <tech>android.nfc.tech.Ndef</tech>
        <tech>android.nfc.tech.NdefFormatable</tech>
        <tech>android.nfc.tech.MifareClassic</tech>
        <tech>android.nfc.tech.MifareUltralight</tech>
    </tech-list>
</resources>

android.nfc.action.TECH_DISCOVERED の代わりに android.nfc.action.NDEF_DISCOVERED でフィルタリングする場合、tech-list は必要ありません。

現在持っているものは、android.nfc.action.TAG_DISCOVERED にドロップされているはずです (参照されているページのフローチャートを参照してください)。

これらのアプリはすべて NDEF_DISCOVERED を処理するため、アプリ リストが生成されている可能性が非常に高くなります。NFC ディスパッチャーの一般的な目的は、Intent を作成し、一致する最初のアプリに配信することです。アプリ チューザーは、複数のアプリがフィルターに一致する場合にのみ表示されます。フロー チャートを見ると、一致するアクションがディスパッチされる可能性がある場合、一致が停止するように見えます。

<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    <action android:name="android.nfc.action.TECH_DISCOVERED" />
    <action android:name="android.nfc.action.TAG_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
于 2013-05-12T17:42:01.300 に答える