简体   繁体   English

使用支持NFC的Android智能手机作为NFC标签,并使用NFC阅读器接收数据

[英]Use NFC enabled android smartphone as NFC tag and receive it data using nfc reader

I am new to NFC i want to NFC enabled android phone as NFC tag and read its data using NFC reader . 我是NFC的新手,我想将启用NFC的Android手机作为NFC标签,并使用NFC阅读器读取其数据。 It would be really great if you could suggest me the already build NFC apps for sending data or which NFC reader hardware should i go with. 如果您可以建议我已经构建用于发送数据的NFC应用程序,或者应该使用哪种NFC阅读器硬件,那将是非常不错的。

this is my NFC sending and Receiving code. 这是我的NFC发送和接收代码。

MainActivity sends files MainActivity发送文件

public class MainActivity extends AppCompatActivity {

NfcAdapter nfcAdapter;
private PendingIntent mPendingIntent;
private IntentFilter[] mIntentFilters;
private String[][] mNFCTechLists;
private TextView mTextView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    nfcAdapter = NfcAdapter.getDefaultAdapter(this);

    mTextView = (TextView)findViewById(R.id.recive_text);
    PackageManager pm = this.getPackageManager();
    // Check whether NFC is available on device
    if (!pm.hasSystemFeature(PackageManager.FEATURE_NFC)) {
        // NFC is not available on the device.
        Toast.makeText(this, "The device does not has NFC hardware.",
                Toast.LENGTH_SHORT).show();
    }
    // Check whether device is running Android 4.1 or higher
    else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
        // Android Beam feature is not supported.
        Toast.makeText(this, "Android Beam is not supported.",
                Toast.LENGTH_SHORT).show();
    }
    else {
        // NFC and Android Beam file transfer is supported.
        Toast.makeText(this, "Android Beam is supported on your device.",
                Toast.LENGTH_SHORT).show();
    }


    // create an intent with tag data and deliver to this activity
    mPendingIntent = PendingIntent.getActivity(this, 0,
            new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

    // set an intent filter for all MIME data
    IntentFilter ndefIntent = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
    try {
        ndefIntent.addDataType("*/*");
        mIntentFilters = new IntentFilter[] { ndefIntent };
    } catch (Exception e) {
        Log.e("TagDispatch", e.toString());
    }

    mNFCTechLists = new String[][] { new String[] { NfcF.class.getName() } };
}

public void sendFile(View view) {


    // Check whether NFC is enabled on device
    if(!nfcAdapter.isEnabled()){
        // NFC is disabled, show the settings UI
        // to enable NFC
        Toast.makeText(this, "Please enable NFC.",
                Toast.LENGTH_SHORT).show();
        startActivity(new Intent(Settings.ACTION_NFC_SETTINGS));
    }
    // Check whether Android Beam feature is enabled on device
    else if(!nfcAdapter.isNdefPushEnabled()) {
        // Android Beam is disabled, show the settings UI
        // to enable Android Beam
        Toast.makeText(this, "Please enable Android Beam.",
                Toast.LENGTH_SHORT).show();
        startActivity(new Intent(Settings.ACTION_NFCSHARING_SETTINGS));
    }
    else {


        Intent chooseFile = new Intent(Intent.ACTION_GET_CONTENT);
        chooseFile.setType("*/*");
        chooseFile = Intent.createChooser(chooseFile, "Choose a file");
        startActivityForResult(chooseFile, 1);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (data!=null) {
        Uri uri = data.getData();
        nfcAdapter.setBeamPushUris(new Uri[]{uri}, this);
    } else {
        Toast.makeText(this,"Please choose a file",Toast.LENGTH_SHORT).show();
    }
}


public void nextScreen(View view){
    startActivity(new Intent(MainActivity.this,SecondActivity.class));
}

public void reciveScreen(View view){
    startActivity(new Intent(MainActivity.this,RecieveScreen.class));
}


@Override
public void onNewIntent(Intent intent) {
    String action = intent.getAction();
    Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

    String s = action + "\n\n" + tag.toString();

    // parse through all NDEF messages and their records and pick text type only
    Parcelable[] data = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);

    if (data != null) {
        try {
            for (int i = 0; i < data.length; i++) {
                NdefRecord[] recs = ((NdefMessage)data[i]).getRecords();
                for (int j = 0; j < recs.length; j++) {
                    if (recs[j].getTnf() == NdefRecord.TNF_WELL_KNOWN &&
                            Arrays.equals(recs[j].getType(), NdefRecord.RTD_TEXT)) {

                        byte[] payload = recs[j].getPayload();
                        String textEncoding = ((payload[0] & 0200) == 0) ? "UTF-8" : "UTF-16";
                        int langCodeLen = payload[0] & 0077;

                        s += ("\n\nNdefMessage[" + i + "], NdefRecord[" + j + "]:\n\"" +
                                new String(payload, langCodeLen + 1,
                                        payload.length - langCodeLen - 1, textEncoding) +
                                "\"");
                    }
                }
            }
        } catch (Exception e) {
            Log.e("TagDispatch", e.toString());
        }

    }

    mTextView.setText(s);
}

@Override
public void onResume() {
    super.onResume();

    if (nfcAdapter != null)
        nfcAdapter.enableForegroundDispatch(this, mPendingIntent, mIntentFilters, mNFCTechLists);
}

@Override
public void onPause() {
    super.onPause();

    if (nfcAdapter != null)
        nfcAdapter.disableForegroundDispatch(this);
}

}

This is my receiving screen, there may be some extra code but you can remove it 这是我的接收屏幕,可能会有一些额外的代码,但是您可以将其删除

public class RecieveScreen extends AppCompatActivity {

private TextView mTextView;
private NfcAdapter mNfcAdapter;
private PendingIntent mPendingIntent;
private IntentFilter[] mIntentFilters;
private String[][] mNFCTechLists;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_recieve_screen);
    mTextView = (TextView)findViewById(R.id.recieve_tv);

    mNfcAdapter = NfcAdapter.getDefaultAdapter(this);

    if (mNfcAdapter != null) {
        mTextView.setText("Read an NFC tag");
    } else {
        mTextView.setText("This phone is not NFC enabled.");
    }

    // create an intent with tag data and deliver to this activity
    mPendingIntent = PendingIntent.getActivity(this, 0,
            new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

    // set an intent filter for all MIME data
    IntentFilter ndefIntent = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
    try {
        ndefIntent.addDataType("*/*");
        mIntentFilters = new IntentFilter[] { ndefIntent };
    } catch (Exception e) {
        Log.e("TagDispatch", e.toString());
    }

    mNFCTechLists = new String[][] { new String[] { NfcF.class.getName() } };
}


@Override
public void onNewIntent(Intent intent) {
    String action = intent.getAction();
    Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

    String s = action + "\n\n" + tag.toString();

    // parse through all NDEF messages and their records and pick text type only
    Parcelable[] data = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);

    if (data != null) {
        try {
            for (int i = 0; i < data.length; i++) {
                NdefRecord[] recs = ((NdefMessage)data[i]).getRecords();
                for (int j = 0; j < recs.length; j++) {
                    if (recs[j].getTnf() == NdefRecord.TNF_WELL_KNOWN &&
                            Arrays.equals(recs[j].getType(), NdefRecord.RTD_TEXT)) {

                        byte[] payload = recs[j].getPayload();
                        String textEncoding = ((payload[0] & 0200) == 0) ? "UTF-8" : "UTF-16";
                        int langCodeLen = payload[0] & 0077;

                        s += ("\n\nNdefMessage[" + i + "], NdefRecord[" + j + "]:\n\"" +
                                new String(payload, langCodeLen + 1,
                                        payload.length - langCodeLen - 1, textEncoding) +
                                "\"");
                    }
                }
            }
        } catch (Exception e) {
            Log.e("TagDispatch", e.toString());
        }

    }

    mTextView.setText(s);
}

@Override
public void onResume() {
    super.onResume();

    if (mNfcAdapter != null)
        mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, mIntentFilters, mNFCTechLists);
}

@Override
public void onPause() {
    super.onPause();

    if (mNfcAdapter != null)
        mNfcAdapter.disableForegroundDispatch(this);
}
}

Let me know if you face any errors. 让我知道您是否遇到任何错误。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM