启动应用程序并通过phonegap cordova只需轻轻一按即可显示NFC标签信息

时间:2016-01-17 04:34:51

标签: android cordova nfc

我正在尝试在Android上编写一个可以使用phonegap读取和显示NFC标签信息的应用程序。 方案如下:

  • 0.智能手机和NFC标签相互接触
  • 1.我的应用程序自动启动
  • 2.在应用程序界面显示NFC标签信息

1.任务可以通过在manifest.xml文件中添加过滤器来完成。

在应用程序启动后,是否可以在不触摸NFC标签的情况下执行2.任务?

由于

2 个答案:

答案 0 :(得分:1)

您需要写入NFC上的标签

  1. 您需要阅读的信息
  2. 您的应用程序包名称。
  3. 在清单中为您的活动添加过滤器

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

    并添加权限

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

    在NfcReader.java中

        public String getNfcData(Intent intent) {
        if (intent.hasExtra(NfcAdapter.EXTRA_TAG)) {
            Parcelable[] parcelables = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
    
            if (parcelables != null && parcelables.length > 0) {
                String data = readTextFromMessage((NdefMessage) parcelables[0]);
                return data;
            } else {
                Toast.makeText(context, "Cannot Read From Tag.", Toast.LENGTH_LONG).show();
                return "No NDEF messages found!";
            }
        }
        return "";
    

    }

        String readTextFromMessage(NdefMessage ndefMessage) {
    
        NdefRecord[] ndefRecords = ndefMessage.getRecords();
    
        if (ndefRecords != null && ndefRecords.length > 0) {
    
            NdefRecord ndefRecord = ndefRecords[0];
    
            String tagContent = getTextFromNdefRecord(ndefRecord);
    
    
            return tagContent;
    
        } else {
            return "No NDEF records found!";
        }
    

    }

          public String getTextFromNdefRecord(NdefRecord ndefRecord) {
        String tagContent = null;
        try {
            byte[] payload = ndefRecord.getPayload();
            String textEncoding = ((payload[0] & 128) == 0) ? "UTF-8" : "UTF-16";
            int languageSize = payload[0] & 0063;
            tagContent = new String(payload, languageSize + 1,
                    payload.length - languageSize - 1, textEncoding);
        } catch (UnsupportedEncodingException e) {
            Log.e("getTextFromNdefRecord", e.getMessage(), e);
        }
        Log.e("log", "getTextFromNdefRecord");
        return tagContent;
    }
    

    在您的主要活动中

         protected void onResume() {
        super.onResume();
    
    
        if (getIntent().hasExtra(NfcAdapter.EXTRA_TAG)) {
            String NfcID = nfcReader.getNfcID(getIntent());
            String tagData = nfcReader.getNfcData(getIntent());
            String nfcPackage = nfcReader.readNfcPackage(getIntent());
    
            Log.d(Const.TAG, "NFCID: " + NfcID);
            Log.d(Const.TAG, "Data: " + tagData);
            Log.d(Const.TAG, "package Name: " + nfcPackage);
    
            if (nfcPackage.equals(Const.packageName)) {
                prefs.edit().putString(Const.VAN_NUMBER_PREF, tagData).commit();
                vanNumberTxt.setText("Van #: " + tagData);
                Tools.vibrator(this);
                toggleButton.setChecked(true);
            } else finish();
        }
    

答案 1 :(得分:0)

感谢@Davit Avetisyan获取详细代码

因此,获取标记信息的关键是从意图中提取

Intent intent = getIntent();

Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
String myTagId = bytesToHexString(tag.getId());

Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
NdefMessage[] msgs = new NdefMessage[rawMsgs.length];

NdefRecord[] records = msgs[i].getRecords();

byte[] payload = records[j].getPayload();