Android 从NFC标签读取数据

Android 从NFC标签读取数据,android,nfc,Android,Nfc,嗨,我正在开发一个应用程序,用于读取和写入数据到NFC标签。我在从NFC标签读取数据时遇到问题。当我尝试读取数据时,我的应用程序第一次崩溃,当我第二次扫描标签时,应用程序再次读取数据。 请帮我解决这个问题。这是我的密码。 提前谢谢 public class Read extends Activity { Tag detectedTag; TextView txtType,txtSize,txtWrite,txtRead; NfcAdapter nfcAdapter;

嗨,我正在开发一个应用程序,用于读取和写入数据到NFC标签。我在从NFC标签读取数据时遇到问题。当我尝试读取数据时,我的应用程序第一次崩溃,当我第二次扫描标签时,应用程序再次读取数据。 请帮我解决这个问题。这是我的密码。 提前谢谢

public class Read extends Activity {

    Tag detectedTag;
    TextView txtType,txtSize,txtWrite,txtRead;
    NfcAdapter nfcAdapter;
    IntentFilter[] readTagFilters;
    PendingIntent pendingIntent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
        setContentView(R.layout.read);
        getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title);

         nfcAdapter = NfcAdapter.getDefaultAdapter();
         detectedTag =getIntent().getParcelableExtra(NfcAdapter.EXTRA_TAG);
        txtType  = (TextView) findViewById(R.id.txtType);
        txtSize  = (TextView) findViewById(R.id.txtsize);
        txtWrite = (TextView) findViewById(R.id.txtwrite);
        txtRead  = (TextView) findViewById(R.id.txt_read);

        pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, 
                new Intent(this,getClass()).
                addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

        IntentFilter tagDetected = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);
        IntentFilter filter2     = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
        readTagFilters = new IntentFilter[]{tagDetected,filter2};

    }

    protected void onNewIntent(Intent intent) {

        if(getIntent().getAction().equals(NfcAdapter.ACTION_TAG_DISCOVERED)){
            detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

            readFromTag(getIntent());
        }
    }

@Override
    protected void onResume() {

        super.onResume();
        nfcAdapter.enableForegroundDispatch(this, pendingIntent, readTagFilters, null);
    }


    public void readFromTag(Intent intent){

        Ndef ndef = Ndef.get(detectedTag);


        try{
            ndef.connect();

            txtType.setText(ndef.getType().toString());
            txtSize.setText(String.valueOf(ndef.getMaxSize()));
            txtWrite.setText(ndef.isWritable() ? "True" : "False");
            Parcelable[] messages = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);

            if (messages != null) {
                NdefMessage[] ndefMessages = new NdefMessage[messages.length];
                for (int i = 0; i < messages.length; i++) {
                    ndefMessages[i] = (NdefMessage) messages[i];
                }
            NdefRecord record = ndefMessages[0].getRecords()[0];

            byte[] payload = record.getPayload();
            String text = new String(payload);
            txtRead.setText(text);


            ndef.close();

        }
        }
        catch (Exception e) {
            Toast.makeText(getApplicationContext(), "Cannot Read From Tag.", Toast.LENGTH_LONG).show();
        }
    }

}
公共类读取扩展活动{
标签检测标签;
TextView txtType、txtSize、txtWrite、txtRead;
NfcAdapter NfcAdapter;
IntentFilter[]readTagFilters;
下垂的下垂的;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE\u自定义\u标题);
setContentView(R.layout.read);
getWindow().setFeatureInt(Window.FEATURE\u CUSTOM\u TITLE,R.layout.CUSTOM\u TITLE);
nfcAdapter=nfcAdapter.getDefaultAdapter();
detectedTag=getIntent().getParcelableExtra(NfcAdapter.EXTRA_标记);
txtType=(TextView)findViewById(R.id.txtType);
txtSize=(TextView)findViewById(R.id.txtSize);
txtWrite=(TextView)findViewById(R.id.txtWrite);
txtRead=(TextView)findViewById(R.id.txt\u read);
PendingEvent=PendingEvent.getActivity(getApplicationContext(),0,
新的意图(这个,getClass()。
addFlags(意图、标志、活动、单个、顶部),0);
IntentFilter tagDetected=新的IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);
IntentFilter filter2=新的IntentFilter(NfcAdapter.ACTION\u NDEF\u DISCOVERED);
readTagFilters=new IntentFilter[]{tagDetected,filter2};
}
受保护的void onNewIntent(意图){
if(getIntent().getAction().equals(NfcAdapter.ACTION_TAG_DISCOVERED)){
detectedTag=intent.getParcelableExtra(NfcAdapter.EXTRA_标记);
readFromTag(getIntent());
}
}
@凌驾
受保护的void onResume(){
super.onResume();
nfcAdapter.enableForegroundDispatch(this、pendingent、readTagFilters、null);
}
public void readFromTag(意图){
Ndef Ndef=Ndef.get(detectedTag);
试一试{
connect();
setText(ndef.getType().toString());
setText(String.valueOf(ndef.getMaxSize());
setText(ndef.iswriteable()?“True”:“False”);
Parcelable[]messages=intent.getParcelableArrayExtra(NfcAdapter.EXTRA\u NDEF\u messages);
如果(消息!=null){
NdefMessage[]ndefMessages=新的NdefMessage[messages.length];
for(int i=0;i
onNewIntent()方法中缺少的唯一一行是 设定意图(intent);
我添加了它,代码运行正常。

你能显示logcat的输出吗?我正在真实设备上测试应用程序……当然可以(模拟器不支持NFC)。通常,在Android设备上,logcat输出是可用的,请参见Hi…当我试图读取数据时,我需要扫描标签两次。一次启动应用程序,另一次应用程序读取数据。我应该做些什么,以便应用程序可以在我第一次扫描标记时读取数据。等待你的答复。谢谢很好的一个,检查一下这个:你可能想检查一下在中发现的样板文件