读取NFC标签上的阵列/有效负载?

时间:2016-10-31 13:41:44

标签: android arrays nfc

我已经编辑了我的Manifest代码和我的Activity代码,以反映适当的意图过滤器要求。但是,我仍然得到相同的结果。我无法阅读我的外部记录,我不知道为什么?当我使用NFC Tools应用程序扫描我的标签时,我可以看到我所期望的一切。我的代码在尝试“读取”我的数组时产生一个NullPointer而我不明白为什么?

-------------- BEGIN MANIFEST --------------------

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.bmt_01">

    <uses-permission android:name="android.permission.NFC"/>
    <uses-permission android:name="android.permission.SEND_SMS"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-sdk android:minSdkVersion="15"/>   ///must be changed in build.gradle.


    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">

            <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="vnd.android.nfc"
                    android:host="ext"
                    android:pathPrefix="/com.example.bmt_01:externaltype"
                    />
            </intent-filter>



        </activity>
    </application>

</manifest>

-------------- END MANIFEST --------------------

--------------开始主要活动-------------

package com.example.bmt_01;

import android.app.Activity;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.nfc.tech.Ndef;
import android.nfc.tech.NdefFormatable;
import android.os.Parcelable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

import java.io.ByteArrayOutputStream;
import java.io.UnsupportedEncodingException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Locale;


public class MainActivity extends AppCompatActivity {
    String currentPayload = "";

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

    }

    @Override
    protected void onNewIntent(Intent intent)
    {
            Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);

        //added the below lines, can delete if they don't work.
            NdefRecord payload = ((NdefMessage)rawMsgs[0]).getRecords()[0];
            String currentPayload = new String(payload.getPayload());


                if (currentPayload.equals("1"))
                {
                    Toast.makeText(this, "NFC Scan1: " + currentPayload, Toast.LENGTH_SHORT).show();


                    String url = "http://www.google.com";
                    Intent l = new Intent(Intent.ACTION_VIEW);
                    l.setData(Uri.parse(url));
                    startActivity(l);
                }
                ///else
                ///{
                    if (currentPayload.equals("2"))
                    {
                        Toast.makeText(this, "NFC Scan2: " + currentPayload, Toast.LENGTH_SHORT).show();


                        String url = "http://www.yahoo.com";
                        Intent l = new Intent(Intent.ACTION_VIEW);
                        l.setData(Uri.parse(url));
                        startActivity(l);
                    }
                ///}
    }

    protected void onResume()
    {
        super.onResume();
        Toast.makeText(this, "NFC Scan3: ", Toast.LENGTH_SHORT).show();
        enableForegroundDispatchSystem();
    }

    @Override
    protected void onPause()
    {
        super.onPause();
        disableForegroundDispatchSystem();
    }

    private void enableForegroundDispatchSystem() {
        Toast.makeText(this, "NFC Scan4: ", Toast.LENGTH_SHORT).show();
    }

    private void disableForegroundDispatchSystem() {
        Toast.makeText(this, "NFC Scan5: ", Toast.LENGTH_SHORT).show();

        onNewIntent(getIntent());


    }
}

--------------结束主要活动---------------

* UPDATE

我应该补充说我的AAR功能正常。当我在手机上安装了上述应用程序但没有打开时,我的AAR会在扫描测试标签时自动打开并启动应用程序。所以,我能够“看到”阵列中的AAR,但不能看到外部记录。

我仍然无法读取标签上的外部记录。显然我做错了,但我不知道。

2 个答案:

答案 0 :(得分:0)

你混合了消息并记录你的for循环。但是,只有一条NDEF消息,但此消息可以包含多条记录。您必须仅使用rawMsgs[0]。然后你的for循环可以迭代该消息的所有记录。

答案 1 :(得分:0)

我创建了一个library,可以解析NDEF记录。

你是在正确的轨道 - 使用外部类型包装二进制paylod - 如果您愿意,库支持插入您自己的外部类型解析器/记录类型。