1

わかりましたので、私は最初の Android アプリで大騒ぎしてきましたが、NFC は非常にうまく機能していませんでした。プレーンテキストタイプのレコードを正常に取得できますが、URI レコードを取得しようとすると、アプリではなく電話のブラウザーが開き続けます。この時点で私は無知なので、ここに私が得たものがあります...

<activity
        android:name=".MainActivity"
        android:label="@string/title_activity_main" >
        <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:scheme="http" android:host="google.com"/>
        </intent-filter>
        <intent-filter>
            <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
            <data android:mimeType="text/plain"/>
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
    </activity>

タグを読むと新しいインテントが出てきますが、アクションタイプは「MAIN」です。リニューアルしただけですか?もしそうなら、なぜテキストレコードは同じことをしないのでしょうか? 複数の uri レコードを試しましたが、毎回この動作が発生します。これは Java src の一部です。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Intent launchIntent = getIntent();
    String action = launchIntent.getAction();
    if(action.equals(NfcAdapter.ACTION_NDEF_DISCOVERED)) {
        Log.i(tag, "MATCH!");
    }


    nfcAdapter = NfcAdapter.getDefaultAdapter(this);
    nfcPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
    tagDetected = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);

    tagDetected.addDataScheme("http");
    tagDetected.addDataAuthority("google.com", null);
    filters = new IntentFilter[] { tagDetected };

    techArray = new String[][] {
            new String[] {
                    IsoDep.class.getName()
            },
            new String[] {
                    NfcB.class.getName()
            },
            new String[] {
                    Ndef.class.getName()
            }
    };

}

public void onResume(){
    super.onResume();



    nfcAdapter.enableForegroundDispatch(this, nfcPendingIntent, filters, techArray);

    Intent launchIntent = getIntent();
    String action = launchIntent.getAction();
    if(action.equals(NfcAdapter.ACTION_NDEF_DISCOVERED)) {
        Log.i(tag, "MATCH!");
    } else if(action.equals(NfcAdapter.ACTION_TECH_DISCOVERED)) {
        Log.i(tag, "TECH DISCOVERED");

    } else if(action.equals(NfcAdapter.ACTION_TAG_DISCOVERED)) {
        Log.i(tag, "TAG DISCOVERED");
    }

    Parcelable[] msg = launchIntent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
    //byte[] payloadData = msg.getRecords()[0].getPayload();
    //Log.i(tag, "NUM records = " + Integer.toString(msg.getRecords().length));


}


public void onPause() {
    super.onPause();

    nfcAdapter.disableForegroundDispatch(this);
}

もう 1 つの興味深い点は、enableForegroundDispatch() 呼び出しにテクノロジのリストを含めない場合、アプリは (uri レコードを読み取ろうとしたときに) NFC から生じるインテントをまったく取得しないことです。賢明なインターネットのアイデアはありますか?!

4

1 に答える 1

0

ForegroundDispatch を有効にすると、インテントは を介し​​て到着するonNewIntent()ため、アクティビティでそのメソッドをオーバーライドして NFC インテントを受け取る必要があります。

また、ホスト名が正確に一致していることを確認する必要があります。タグに「www.google.com」が含まれている場合、インテント フィルタには同じ名前が含まれている必要があります:<data android:scheme="http" android:host="www.google.com"/>tagDetected.addDataAuthority("www.google.com", null).

于 2012-08-27T22:37:05.870 に答える