1

こんにちは、NFCタグから読み取ろうとしています。しかし、私は例外を受けています。

タグを検出するためにこの条件を設定しましたか?

if(NfcAdapter.ACTION_TAG_DISCOVERED != null)

この条件は正しいですか?

4

4 に答える 4

3

まず、NFC アダプターを初期化し、onCreate コールバックで Pending Intent を定義する必要があります。

NfcAdapter mAdapter;
PendingIntent mPendingIntent;
mAdapter = NfcAdapter.getDefaultAdapter(this);

if (mAdapter == null) {
    //nfc not support your device.
    return;
}
mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
    getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

onResume() Call back で、Foreground Dispatch が NFC インテントを検出できるようにします。

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

onPause() コールバックでは、フォアグラウンド ディスパッチを無効にする必要があります。

if (mAdapter != null) {
    mAdapter.disableForegroundDispatch(this);
}

onNewIntent() コールバック メソッドで、新しい Nfc インテントを取得します。The Intent を取得したら、インテントを解析してカードを検出する必要があります。

@Override
protected void onNewIntent(Intent intent) {
    getTagInfo(intent)
}

private void getTagInfo(Intent intent) {
    Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

    String[] techList = tag.getTechList();
    for (int i = 0; i<techList.length; i++) {
        if (techList[i].equals(MifareClassic.class.getName())) {

            MifareClassic mifareClassicTag = MifareClassic.get(tag);
            switch (mifareClassicTag.getType()) {
                case MifareClassic.TYPE_CLASSIC:
                    //Type Clssic
                    break;
                case MifareClassic.TYPE_PLUS:
                    //Type Plus
                    break;
                case MifareClassic.TYPE_PRO:
                    //Type Pro
                    break;
            }
        } else if (techList[i].equals(MifareUltralight.class.getName())) {
            //For Mifare Ultralight
            MifareUltralight mifareUlTag = MifareUltralight.get(tag);
            switch (mifareUlTag.getType()) {
                case MifareUltralight.TYPE_ULTRALIGHT:
                    break;
                case MifareUltralight.TYPE_ULTRALIGHT_C:

                    break;
            }
        } else if (techList[i].equals(IsoDep.class.getName())) {
            // info[1] = "IsoDep";
            IsoDep isoDepTag = IsoDep.get(tag);

        } else if (techList[i].equals(Ndef.class.getName())) {
            Ndef.get(tag);

        } else if (techList[i].equals(NdefFormatable.class.getName())) {

            NdefFormatable ndefFormatableTag = NdefFormatable.get(tag);

        }
    }
}

完全な完全なコードはこちらです。

于 2015-02-17T15:48:31.333 に答える
2

コードに関する質問に答えるには -

それは常に真です-NfcAdapter.ACTION_TAG_DISCOVERED定数値です-使用する必要があります:

getIntent().getAction().equals(NfcAdapter.ACTION_TAG_DISCOVERED) 

それを比較します。

しかし、それはおそらくあなたの例外とは何の関係もありません-

  1. AndroidマニフェストにNFC許可を含めましたか?
  2. お使いの携帯電話が NFC をサポートしていると確信していますか?現時点では 2 つまたは 3 つしかサポートしていません。
  3. 例外の原因を知るには、ログからのスタック トレースが必要です。
于 2012-09-07T07:30:38.630 に答える
1

その声明は常に真実です。

私は正しい軌道に乗るための定型プロジェクトを含むプロジェクトを作成しました。

于 2012-09-17T22:54:39.577 に答える