早上好,我想使用我在页面上找到的写法:
https://developer.android.com/guide/topics/connectivity/nfc/advanced-nfc.html,写一个超轻的mifare.我还没有成功.
- public void writeTag(Tag tag,String tagText) {
- MifareUltralight ultralight = MifareUltralight.get(tag);
- try {
- ultralight.connect();
- ultralight.writePage(4,"abcd".getBytes(Charset.forName("US-ASCII")));
- ultralight.writePage(5,"efgh".getBytes(Charset.forName("US-ASCII")));
- ultralight.writePage(6,"ijkl".getBytes(Charset.forName("US-ASCII")));
- ultralight.writePage(7,"mnop".getBytes(Charset.forName("US-ASCII")));
- } catch (IOException e) {
- Log.e(TAG,"IOException while closing MifareUltralight...",e);
- } finally {
- try {
- ultralight.close();
- } catch (IOException e) {
- Log.e(TAG,e);
- }
- }
- }
我如何从主打电话给它?
我认为有必要插入一个按钮来检查标签是否存在.
我在我的活动(不是主要活动)中添加了“前台调度系统”,但是我仍然不明白如果标签存在与否,如何显示消息,在使用读写方法之前要检查什么?
- package com.example.administrator.myapplication3;
- import android.app.PendingIntent;
- import android.content.Intent;
- import android.content.IntentFilter;
- import android.nfc.NfcAdapter;
- import android.nfc.Tag;
- import android.nfc.tech.MifareUltralight;
- import android.nfc.tech.Ndef;
- import android.nfc.tech.NfcA;
- import android.nfc.tech.NfcB;
- import android.nfc.tech.NfcF;
- import android.nfc.tech.NfcV;
- import android.support.v7.app.AppCompatActivity;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.View;
- import android.widget.Button;
- import android.widget.TextView;
- import java.io.IOException;
- import java.nio.charset.Charset;
- public class DisplayMessageActivity extends AppCompatActivity {
- private NfcAdapter mAdapter;
- private PendingIntent pendingIntent;
- private IntentFilter[] mFilters;
- private String[][] mTechLists;
- private static final String TAG = MainActivity.class.getSimpleName();
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_display_message);
- // Get the Intent that started this activity and extract the string
- Intent intent = getIntent();
- String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
- // Capture the layout's TextView and set the string as its text
- TextView textView = (TextView) findViewById(R.id.textView);
- textView.setText(message);
- pendingIntent = PendingIntent.getActivity( this,new Intent(this,getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),0);
- mAdapter = NfcAdapter.getDefaultAdapter(this);
- pendingIntent = PendingIntent.getActivity(
- this,0);
- // Setup an intent filter for all MIME based dispatches
- IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
- try {
- ndef.addDataType("*/*");
- } catch (IntentFilter.MalformedMimeTypeException e) {
- throw new RuntimeException("fail",e);
- }
- IntentFilter td = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);
- mFilters = new IntentFilter[] {
- ndef,td
- };
- // Setup a tech list for all NfcF tags
- mTechLists = new String[][] { new String[] { MifareUltralight.class.getName(),Ndef.class.getName(),NfcA.class.getName()}};
- Button b = (Button) findViewById(R.id.button2);
- b.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- TextView tv = (TextView) findViewById(R.id.textView);
- Tag tag = getIntent().getParcelableExtra(NfcAdapter.EXTRA_TAG);
- tv.setText("Click!");
- //byte[] x=tag.getId();
- writeTag(tag,"x");
- Log.e(TAG,"cc");
- }
- });
- }
- @Override
- public void onResume()
- {
- super.onResume();
- mAdapter.enableForegroundDispatch(this,pendingIntent,mFilters,mTechLists);
- }
- @Override
- public void onPause()
- {
- super.onPause();
- mAdapter.disableForegroundDispatch(this);
- }
- @Override
- public void onNewIntent(Intent intent){
- // fetch the tag from the intent
- Tag t = (Tag)intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
- // String tlist = getTechList(t);
- // android.util.Log.v("NFC","Discovered tag ["+tlist+"]["+t+"] with intent: " + intent);
- // android.util.Log.v("NFC","{"+t+"}");
- }
- public void writeTag(Tag tag,String tagText) {
- MifareUltralight ultralight = MifareUltralight.get(tag);
- try {
- ultralight.connect();
- ultralight.writePage(4,"abcd".getBytes(Charset.forName("US-ASCII")));
- ultralight.writePage(5,"efgh".getBytes(Charset.forName("US-ASCII")));
- ultralight.writePage(6,"ijkl".getBytes(Charset.forName("US-ASCII")));
- ultralight.writePage(7,"mnop".getBytes(Charset.forName("US-ASCII")));
- } catch (IOException e) {
- Log.e(TAG,e);
- } finally {
- try {
- ultralight.close();
- } catch (IOException e) {
- Log.e(TAG,e);
- }
- }
- }
- public String readTag(Tag tag) {
- MifareUltralight mifare = MifareUltralight.get(tag);
- try {
- mifare.connect();
- byte[] payload = mifare.readPages(4);
- return new String(payload,Charset.forName("US-ASCII"));
- } catch (IOException e) {
- Log.e(TAG,"IOException while writing MifareUltralight message...",e);
- } finally {
- if (mifare != null) {
- try {
- mifare.close();
- }
- catch (IOException e) {
- Log.e(TAG,"Error closing tag...",e);
- }
- }
- }
- return null;
- }
- }
谢谢!
解决方法
扫描新的NFC标签后立即调用onNewIntent(Intent intent).例如,如果您想要写入每个扫描的标记,则onNewIntent()方法将如下所示:
- //This method is called whenever a new tag is scanned while the activity is running
- //Whatever you want to do with scanned tags,do it in here
- @Override
- public void onNewIntent(Intent intent){
- // fetch the tag from the intent
- Tag tag = (Tag)intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
- //Write a String onto the tag
- writeTag(tag,"Put any string here");
- }
你的writeTag方法当然还没有使用它给出的字符串,但你可能知道.
如果您想要保持最新的布尔值以检查可用标记,请执行以下操作:
- @Override
- public void onNewIntent(Intent intent){
- (new Thread(new Runnable() {
- @Override
- public void run() {
- // fetch the tag from the intent
- Tag tag = (Tag)intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
- MifareUltralight myTag = MifareUltralight.get(tag);
- /* Alternative to MifareUltralight:
- NfcA myTag = NfcA.get(tag);
- */
- myTag.connect();
- while(true){
- //someBoolean is just a Boolean that you can use in other threads to ask if tag is still there
- someBoolean = true;
- //Keep reading the tag until it ends in an exception
- //when the exception occurs,you know the tag is gone
- try{
- myTag.transceive(new byte[] {
- (byte) 0xXX,// READ command for your tag here
- (byte) 0xXX,// Address of serial or UID field of your tag here
- });
- }catch(IOException e){
- myTag.disconnect();
- break;
- }
- }
- //When loop breaks,the tag is gone,so we set the variable back to false
- someBoolean = false;
- }
- })).start();
- }