关于Android NFC 往标签写数据 跳转指定APP的指定界面

之前有需求,再扫描商品NFC标签的时候直接跳转到APP中的商品详情界面。提供的NFC标签没有数据,需要自己写入数据。

如何去写入标签数据 并指定跳转界面呢。这里做一下记录。

/**
     * 往标签写数据的方法
     */
    public void writeNFCTag() {
       Tag detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        NdefMessage ndefMessage = new NdefMessage(new NdefRecord[]{
                //三个参数 第一个 和 第二个 就是在清单文件中定义在接受的activity 
                //<intent-filter> 前缀  第三个是要写入的信息
                NdefRecord.createExternal("angel.touch.com", "nfc", content.getBytes()),
                //这里是要跳转到的APP的包名
                NdefRecord.createApplicationRecord("com.***.***.***")});
        //转换成字节获得大小
        int size = ndefMessage.toByteArray().length;
        try {
            //2.判断NFC标签的数据类型(通过Ndef.get方法)
            Ndef ndef = Ndef.get(tag);
            //判断是否为NDEF标签
            if (ndef != null) {
                ndef.connect();
                //判断是否支持可写
                if (!ndef.isWritable()) {
                    return;
                }
                //判断标签的容量是否够用
                if (ndef.getMaxSize() < size) {
                    return;
                }
                //3.写入数据
                ndef.writeNdefMessage(ndefMessage);
                Toast.makeText(this, "写入成功", Toast.LENGTH_SHORT).show();
            } else {
                //若标签为格式化按此步骤进行
                NdefFormatable format = NdefFormatable.get(tag);//Ndef格式类
                //判断是否获得了NdefFormatable对象,有一些标签是只读的或者不允许格式化的
                if (format != null) {
                    //连接
                    format.connect();
                    //格式化并将信息写入标签
                    format.format(ndefMessage);
                    Toast.makeText(this, "写入成功",
                            Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(this, "写入失败", Toast.LENGTH_SHORT).show();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

在读取NFC的APP中(包名与上面代码中createApplicationRecord写入时的包名相同) 的AndroidManifest.xml中声明Activity应该如下操作

<activity
   android:name=".activity.NFCProductActivity"
   android:launchMode="singleInstance">
   <intent-filter>
       <action android:name="android.nfc.action.NDEF_DISCOVERED" />
       <category android:name="android.intent.category.DEFAULT" />
       <data
          android:host="ext"
          android:pathPrefix="/angel.touch.com:nfc"
          android:scheme="vnd.android.nfc" />
          <!-- //此处照写,标准写法-->
          <!--//这里是你后面写入的数据的一部分createExternal部分数据-->
          <!--//此处照写,标准写法-->
     </intent-filter>
</activity>
NdefRecord.createExternal("angel.touch.com", "nfc", content.getBytes());
android:pathPrefix="/angel.touch.com:nfc"

这两段代码中的定义的就是系统识别到NFC的信息后,会直接唤起APP的这个activity

要实现手机NFC读卡的编程,可以使用Android平台提供的NFC API。以下是实现手机NFC读卡的基本步骤: 1. 在AndroidManifest.xml文件中添加NFC权限: ```xml <uses-permission android:name="android.permission.NFC"/> ``` 2. 在Activity中注册NFC事件: ```java public class MainActivity extends AppCompatActivity implements NfcAdapter.ReaderCallback { private NfcAdapter nfcAdapter; private PendingIntent pendingIntent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); nfcAdapter = NfcAdapter.getDefaultAdapter(this); pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); } @Override protected void onResume() { super.onResume(); nfcAdapter.enableReaderMode(this, this, NfcAdapter.FLAG_READER_NFC_A | NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK, null); } @Override protected void onPause() { super.onPause(); nfcAdapter.disableReaderMode(this); } @Override public void onTagDiscovered(Tag tag) { // 处理数据读取逻辑 } } ``` 3. 实现onTagDiscovered方法,处理数据读取逻辑: ```java @Override public void onTagDiscovered(Tag tag) { byte[] id = tag.getId(); String tagId = bytesToHexString(id); // 处理读取到的数据 } private static String bytesToHexString(byte[] src) { StringBuilder stringBuilder = new StringBuilder(""); if (src == null || src.length <= 0) { return null; } for (int i = 0; i < src.length; i++) { int v = src[i] & 0xFF; String hv = Integer.toHexString(v); if (hv.length() < 2) { stringBuilder.append(0); } stringBuilder.append(hv); } return stringBuilder.toString(); } ``` 需要注意的是,NFC读卡器返回的数据格式不同,需要根据具体的读卡器进行解析。另外,读卡器的读卡距离也有限制,需要保持读卡器和手机的距离适当。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值