Realization method of NFC reading and writing function in android

  • 2021-12-19 07:00:13
  • OfStack

In this paper, we share the specific code of NFC reading and writing function in android for your reference. The specific contents are as follows

First, check whether the device under 1 supports NFC function


private void checkNFCFunction() {
        // TODO Auto-generated method stub
        mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
        // check the NFC adapter first
        if (mNfcAdapter == null) {
            // mTextView.setText("NFC apdater is not available");
            Dialog dialog = null;
            AlertDialog.Builder customBuilder = new AlertDialog.Builder(
                    this);
            customBuilder
                    .setTitle(" It's a pity ")
                    .setMessage(" Didn't find NFC Device, please confirm your device support NFC Function !")
                    .setIcon(R.drawable.ic_banner)
                    .setPositiveButton(" Yes ",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,
                                                    int which) {
                                    dialog.dismiss();
                                    finish();
                                }
                            });
            dialog = customBuilder.create();
            dialog.setCancelable(false);// back
            dialog.setCanceledOnTouchOutside(false);
            SetDialogWidth(dialog).show();
            return;
        } else {
            if (!mNfcAdapter.isEnabled()) {
                Dialog dialog = null;
                AlertDialog.Builder customBuilder = new AlertDialog.Builder(
                        this);
                customBuilder
                        .setTitle(" Prompt ")
                        .setMessage(" Please confirm NFC Is the function turned on !")
                        .setIcon(R.drawable.ic_banner)
                        .setPositiveButton(" Now go and open it ......",
                                new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog,
                                                        int which) {
                                        dialog.dismiss();
                                        Intent setnfc = new Intent(
                                                Settings.ACTION_NFC_SETTINGS);
                                        startActivity(setnfc);
                                    }
                                });
                dialog = customBuilder.create();
                dialog.setCancelable(false);// back
                dialog.setCanceledOnTouchOutside(false);
                SetDialogWidth(dialog).show();
                return;
            }
        }
    }

Read NFC information


package com.xxzhy.shujucaiji.fengxiang;

import android.app.Dialog;
import android.app.PendingIntent;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.nfc.FormatException;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.nfc.tech.MifareClassic;
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.os.Bundle;
import android.provider.Settings;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.xxzhy.shujucaiji.R;
import com.xxzhy.shujucaiji.utils.ByteArrayChange;
import com.xxzhy.shujucaiji.utils.ToStringHex;
import com.xxzhy.shujucaiji.utils.ToastUtil;
import com.xxzhy.shujucaiji.utils.WebServiceClient;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;

import butterknife.BindView;
import butterknife.ButterKnife;


/**
 * Created by apple on 2017/10/30.
 */

public class FengxiangThreeActivity extends AppCompatActivity {

    @BindView(R.id.tv_bianma)
    TextView tvBianma;
    @BindView(R.id.ll_input)
    LinearLayout llInput;
    @BindView(R.id.noteText)
    TextView noteText;
    @BindView(R.id.writeBtn)
    Button writeBtn;
    String[][] mTechLists;
    private Boolean ifWrite;
    private NfcAdapter mNfcAdapter;
    private PendingIntent mPendingIntent;
    private IntentFilter[] mFilters;
    byte[] code = MifareClassic.KEY_DEFAULT;// Read and write the password of each block in the tag 
    private byte[] b0;
    int block[] = {4, 5, 6, 8, 9, 10, 12, 13, 14, 16, 17, 18, 20, 21, 22, 24,
            25, 26, 28, 29, 30, 32, 33, 34, 36, 37, 38, 40, 41, 42, 44, 45, 46,
            48, 49, 50, 52, 53, 54, 56, 57, 58, 60, 61, 62};
    private String samCode;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fengxiang_three);
        ButterKnife.bind(this);
        writeBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ifWrite = true;
            }
        });
        samCode = getIntent().getStringExtra("samCode");
        tvBianma.setText(samCode);
        checkNFCFunction(); // NFC Check

        mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
                getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
        // Setup an intent filter for all MIME based dispatches
        IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED);
        try {
            ndef.addDataType("*/*");
        } catch (IntentFilter.MalformedMimeTypeException e) {
            throw new RuntimeException("fail", e);
        }
        mFilters = new IntentFilter[]{ndef,};

        //  Set according to label type 
        mTechLists = new String[][]{new String[]{NfcA.class.getName()}};
    }

    private void checkNFCFunction() {
        // TODO Auto-generated method stub
        mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
        // check the NFC adapter first
        if (mNfcAdapter == null) {
            // mTextView.setText("NFC apdater is not available");
            Dialog dialog = null;
            AlertDialog.Builder customBuilder = new AlertDialog.Builder(
                    this);
            customBuilder
                    .setTitle(" It's a pity ")
                    .setMessage(" Didn't find NFC Device, please confirm your device support NFC Function !")
                    .setIcon(R.drawable.ic_banner)
                    .setPositiveButton(" Yes ",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,
                                                    int which) {
                                    dialog.dismiss();
                                    finish();
                                }
                            });
            dialog = customBuilder.create();
            dialog.setCancelable(false);// back
            dialog.setCanceledOnTouchOutside(false);
            SetDialogWidth(dialog).show();
            return;
        } else {
            if (!mNfcAdapter.isEnabled()) {
                Dialog dialog = null;
                AlertDialog.Builder customBuilder = new AlertDialog.Builder(
                        this);
                customBuilder
                        .setTitle(" Prompt ")
                        .setMessage(" Please confirm NFC Is the function turned on !")
                        .setIcon(R.drawable.ic_banner)
                        .setPositiveButton(" Now go and open it ......",
                                new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog,
                                                        int which) {
                                        dialog.dismiss();
                                        Intent setnfc = new Intent(
                                                Settings.ACTION_NFC_SETTINGS);
                                        startActivity(setnfc);
                                    }
                                });
                dialog = customBuilder.create();
                dialog.setCancelable(false);// back
                dialog.setCanceledOnTouchOutside(false);
                SetDialogWidth(dialog).show();
                return;
            }
        }
    }

    private Dialog SetDialogWidth(Dialog dialog) {
        // TODO  Automatically generated method stubs 
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        int screenWidth = dm.widthPixels;
        int screenHeight = dm.heightPixels;
        WindowManager.LayoutParams params = dialog.getWindow().getAttributes();
        if (screenWidth > screenHeight) {
            params.width = (int) (((float) screenHeight) * 0.875);

        } else {
            params.width = (int) (((float) screenWidth) * 0.875);
        }
        dialog.getWindow().setAttributes(params);

        return dialog;
    }


    @Override
    protected void onNewIntent(Intent intent) {
        // TODO  Automatically generated method stubs 
        super.onNewIntent(intent);
//        tv1.setText(" Discover new  Tag:  " + ++mCount + "\n");// mCount  Count 
        String intentActionStr = intent.getAction();//  Obtained the action
        if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intentActionStr)// NDEF Type 
                || NfcAdapter.ACTION_TECH_DISCOVERED.equals(intentActionStr)//  Other types 
                || NfcAdapter.ACTION_TAG_DISCOVERED.equals(intentActionStr)) {//  Unknown type 

            //  In intent Read in Tag id
            Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
            byte[] bytesId = tag.getId();//  Get id Array 

//            info += ByteArrayChange.ByteArrayToHexString(bytesId) + "\n";
//            tv2.setText(" Label UID:  " + "\n" + info);

            //  Read stored information 
//            if (mRead.isChecked()) {
//                // mChange=false;
//                tv3.setText(" Read Successfully ! " + readTag(tag));
//                // readNfcVTag(tag);
//                etSector.setText("");
//                etBlock.setText("");
//                etData.setText("");
//            }

            //  Write data 
            if (ifWrite) {
                if (samCode.length() < 16){
                    for (int i = samCode.length(); i < 16; i++) {
                        samCode+=" ";
                    }
                }
                writeTag(tag, samCode);
            }

            //  Convert to ASCll
//            if (mChange.isChecked()) {
//                tv3.setText(change(tag));
//                Toast.makeText(getBaseContext(), " Successful conversion ", Toast.LENGTH_SHORT).show();
//                etSector.setText("");
//                etBlock.setText("");
//                etData.setText("");
//            }
        }
    }

    //  Write data 
    public void writeTag(Tag tag, String str) {
        MifareClassic mfc = MifareClassic.get(tag);
        try {
            if (mfc != null) {
                mfc.connect();
            } else {
                Toast.makeText(this, " Write failure ", Toast.LENGTH_SHORT).show();
                return;
            }
            boolean b = mfc.authenticateSectorWithKeyA(5, code);
            if (b) {
                mfc.writeBlock(4 * 5, str.getBytes());
                mfc.close();
                ToastUtil.showToast(" Write successful ");
                finish();
            }
        } catch (IOException e) {
            e.printStackTrace();
            ToastUtil.showToast(" Write failure ");
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        enableForegroundDispatch();
    }

    private void enableForegroundDispatch() {
        if (mNfcAdapter != null) {
            mNfcAdapter.enableForegroundDispatch(this, mPendingIntent,
                    mFilters, mTechLists);
        }
    }


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

    private void disableForegroundDispatch() {
        // TODO  Automatically generated method stubs 
        if (mNfcAdapter != null) {
            mNfcAdapter.disableForegroundDispatch(this);
        }
    }
}

Related articles: