android中NFC读写功能的实现方法

作者:kcl5715305 时间:2023-10-19 12:30:07 

本文实例为大家分享了android中NFC读写功能的具体代码,供大家参考,具体内容如下

首先检查一下设备是否支持NFC功能


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("很遗憾")
                   .setMessage("没发现NFC设备,请确认您的设备支持NFC功能!")
                   .setIcon(R.drawable.ic_banner)
                   .setPositiveButton("是",
                           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("提示")
                       .setMessage("请确认NFC功能是否开启!")
                       .setIcon(R.drawable.ic_banner)
                       .setPositiveButton("现在去开启......",
                               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;
           }
       }
   }

读取NFC信息


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;//读写标签中每个块的密码
   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,};

// 根据标签类型设置
       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("很遗憾")
                   .setMessage("没发现NFC设备,请确认您的设备支持NFC功能!")
                   .setIcon(R.drawable.ic_banner)
                   .setPositiveButton("是",
                           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("提示")
                       .setMessage("请确认NFC功能是否开启!")
                       .setIcon(R.drawable.ic_banner)
                       .setPositiveButton("现在去开启......",
                               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 自动生成的方法存根
       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 自动生成的方法存根
       super.onNewIntent(intent);
//        tv1.setText("发现新的 Tag:  " + ++mCount + "\n");// mCount 计数
       String intentActionStr = intent.getAction();// 获取到本次启动的action
       if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intentActionStr)// NDEF类型
               || NfcAdapter.ACTION_TECH_DISCOVERED.equals(intentActionStr)// 其他类型
               || NfcAdapter.ACTION_TAG_DISCOVERED.equals(intentActionStr)) {// 未知类型

// 在intent中读取Tag id
           Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
           byte[] bytesId = tag.getId();// 获取id数组

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

// 读取存储信息
//            if (mRead.isChecked()) {
//                // mChange=false;
//                tv3.setText("读取成功! " + readTag(tag));
//                // readNfcVTag(tag);
//                etSector.setText("");
//                etBlock.setText("");
//                etData.setText("");
//            }

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

// 转换为ASCll
//            if (mChange.isChecked()) {
//                tv3.setText(change(tag));
//                Toast.makeText(getBaseContext(), "转换成功", Toast.LENGTH_SHORT).show();
//                etSector.setText("");
//                etBlock.setText("");
//                etData.setText("");
//            }
       }
   }

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

@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 自动生成的方法存根
       if (mNfcAdapter != null) {
           mNfcAdapter.disableForegroundDispatch(this);
       }
   }
}

来源:https://blog.csdn.net/kcl5715305/article/details/100033684

标签:android,NFC,读写
0
投稿

猜你喜欢

  • Kotlin中空判断与问号和感叹号标识符使用方法

    2022-11-12 13:48:04
  • C#中的自动类型转换和强制类型转换

    2023-08-10 07:11:14
  • Java实现雪花算法(snowflake)

    2022-10-27 03:43:23
  • IDEA不编译除了.java之外的文件的解决办法(推荐)

    2023-09-16 15:50:44
  • Kotlin基础学习之循环和异常

    2023-05-26 00:42:12
  • android实现扑克卡片翻转

    2021-10-19 08:08:35
  • 一篇文章带你了解JVM垃圾回收

    2023-08-06 23:42:20
  • Java Resource路径整理总结

    2021-11-24 06:52:31
  • Android开发教程之如何屏蔽View的重复点击

    2021-05-27 10:06:56
  • Java抢红包的红包生成算法

    2023-06-23 20:52:04
  • C# WebApi 接口返回值不困惑:返回值类型详解

    2022-05-06 13:16:35
  • JAVA对象和字节数组互转操作

    2022-05-06 22:57:28
  • 使用fileupload组件实现文件上传功能

    2023-05-04 02:48:06
  • Spring Boot集成MyBatis实现通用Mapper的配置及使用

    2023-07-03 18:17:10
  • 如何解决springboot读取配置文件的中文乱码问题

    2022-09-13 22:26:42
  • MyBatis多对多关联映射创建示例

    2023-08-09 06:40:10
  • 详解Spring Boot Profiles 配置和使用

    2021-10-05 22:54:57
  • Android中访问证书有问题的SSL网页的方法

    2023-11-20 10:22:00
  • 利用Springboot+Caffeine实现本地缓存实例代码

    2022-05-31 09:13:33
  • 使用Docker搭建Java环境的步骤方法

    2022-09-07 16:03:59
  • asp之家 软件编程 m.aspxhome.com