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

本文实例为大家分享了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);
        }
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android实现读取NFC卡的编号

    本文实例为大家分享了Android读取NFC卡的编号具体代码,供大家参考,具体内容如下 NFC相关androidManifest文件设置: 一.权限:<uses-permission android:name="android.permission.NFC"/> 二.sdk级别限制:<uses-sdk android:minSdkVersion="10"/> 三.特殊功能限制<uses-feature android:name=&quo

  • 深入分析Android NFC技术 android nfc开发

    从概念,实现原理以及最红实现的源码等有助于大家对NFC技术有更深入的理解. NFC 是 Near Field Communication 缩写,即近距离无线通讯技术.可以在移动设备.消费类电子产品.PC 和智能控件工具间进行近距离无线通信.简单一点说,nfc 功能是什么?nfc功能有什么用?其实NFC提供了一种简单.触控式的解决方案,可以让消费者简单直观地交换信息.访问内容与服务.NFC 技术允许电子设备之间进行非接触式点对点数据传输,在十厘米(3.9英吋)内,交换数据,其传输速度有106Kbi

  • android nfc常用标签读取总结

    有几天没有更新博客了,不过本篇却准备了许久,希望能带给每一位开发者最简单高效的学习方式.废话到此为止,下面开始正文. NFC(Near Field Communication,近场通信)是一种数据传输技术.与Wi-Fi.蓝牙.红外线等数据传输技术的一个主要差异就是有效距离一般不能超过4厘米.但是NFC传输速度要比红外快.目前NFC已经出现了一些应用,例如电子标签识别.刷手机.点对点付款.身份识别.信息记录等,本篇文章的目的是为大家揭开NFC标签的面纱. 下面我们先从NFC的工作模式开始阐述NFC

  • Android实现读取NFC卡卡号示例

    Android实现读取NFC卡卡号示例,具体如下: 1.权限 <uses-permission android:name="android.permission.NFC" /> <uses-feature android:name="android.hardware.nfc" android:required="true" /> 2.注册(静态) <intent-filter> <action andro

  • android实现NFC读写功能

    一.NFC是什么? 近距离无线通讯技术,这个技术由非接触式射频识别(RFID)演变而来,由飞利浦半导体(现恩智浦半导体公司).诺基亚和索尼共同研制开发,其基础是RFID及互连技术.近场通信(Near Field Communication,NFC)是一种短距高频的无线电技术,在13.56MHz频率运行于20厘米距离内.其传输速度有106 Kbit/秒.212 Kbit/秒或者424 Kbit/秒三种.目前近场通信已通过成为ISO/IEC IS 18092国际标准.ECMA-340标准与ETSI

  • Android实现NFC读取校园卡

    本文实例为大家分享了Android实现NFC读取校园卡的具体代码,供大家参考,具体内容如下 主程序: package com.nfclab.stuCard; import java.io.IOException; import android.app.Activity; import android.app.PendingIntent; import android.content.Intent; import android.content.IntentFilter; import andro

  • Android 使用手机NFC的读取NFC标签数据的方法

    一 你需要准备的: 一部有nfc的手机,一张有nfc标签的卡 二 nfc简介 nfc(近距离无线通讯技术),是由非接触式射频识别(RFID)及互连互通技术整合演变而来,通过在单一芯片上集成感应式读卡器.感应式卡片和点对点通信的功能,利用移动终端实现移动支付.电子票务.门禁.移动身份识别.防伪等应用. 三 nfc过滤标签的设置 3-1 在Manifest添加权限: 在xml里添加nfc的使用权限 <uses-permission android:name="android.permissio

  • 详解Android平台上读写NFC标签

    本文主要谈一谈Android上有关NFC标签的读写问题(NDEF格式). 硬件环境:android4.0(Sony M35h)+可读可写的NFC标签若干 一.NFC基础知识 1.NFC是什么? NFC,即Near Field Communication,近距离无线通讯技术,是一种短距离的(通常<=4cm或更短)高频(13.56M Hz)无线通信技术,它提供了一种简单.触控式的解决方案,可以让消费者简单直观地交换信息.访问内容与服务. 2.NFC的技术优势? 与蓝牙相比:NFC操作简单,配对迅速

  • android模拟器开发和测试nfc应用实例详解

    从Android2.3开始支持NFC.不过NFC应用只能在Android手机(或平板电脑)上测试和开发,而且Android手机还必须有NFC芯 片.而且如果测试NFC传输文件时至少需要两部支持NFC的手机.当然,如果测试读写NFC标签,还需要一些NFC标签或帖子.而且NFC在模拟器上时不能运行的.所以从这一点来说,NFC开发需要更多的设备,比较麻烦.这也蓝牙.传感器是一样的.都不能在Android模拟器上开发和测试.真不知道Google为什么不解决这一问题. 不过这种问题也不是不能解决,而且并不

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

    本文实例为大家分享了android中NFC读写功能的具体代码,供大家参考,具体内容如下 首先检查一下设备是否支持NFC功能 private void checkNFCFunction() { // TODO Auto-generated method stub mNfcAdapter = NfcAdapter.getDefaultAdapter(this); // check the NFC adapter first if (mNfcAdapter == null) { // mTextVie

  • Android中实现ping功能的多种方法详解

    使用java来实现ping功能. 并写入文件.为了使用java来实现ping的功能,有人推荐使用java的 Runtime.exec()方法来直接调用系统的Ping命令,也有人完成了纯Java实现Ping的程序,使用的是Java的NIO包(native io, 高效IO包).但是设备检测只是想测试一个远程主机是否可用.所以,可以使用以下三种方式来实现: 1. Jdk1.5的InetAddresss方式 自从Java 1.5,java.net包中就实现了ICMP ping的功能. 使用时应注意,如

  • android中DatePicker和TimePicker的使用方法详解

    本文以实例讲述了android中DatePicker和TimePicker的使用方法,具体步骤如下: 下面是实现具体功能的代码,其中main.xml代码为: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width=&quo

  • Android中Listview点赞功能的实现

    最近这段时间一直在看Android,利用Listview去实现点赞功能,下面给大家介绍下基本思路. 基本思路: 进入界面–>获取数据–> 在Listview中显示–> 通过map集合(position,boolean)保存每一行是否被点击–> 利用实体类去保存相应的对象–> get/set方法进行相应值得改变–> 点击一次,相应的数量加1 只实现了点赞功能,踩和赞基本类似. 具体实现如下: 继承自BaseAdapter package com.gz.test_listv

  • Android中文件读写(输入流和输出流)操作小结

    1. Android中文件读写的原理: (1).所有文件的储存都是字节的储存. (2).在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘. (3).在读取文件(特别是文本文件)时,也是一个字节一个字节的读取以形成字节序列. 2. 字节流和字符流的区别: (1).字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,字符流就可以. (2).字节流转换成字符流可以用InputStreamReader,OutputStreamWriter. 一般我们在

  • Android中使用定时器的三种方法

    本文实例为大家分享了Android中使用定时器的三种方法,供大家参考,具体内容如下 图示: 因为都比较简单,所以就直接贴代码(虑去再次点击停止的操作),有个全局的Handler负责接收消息更新UI 第一种方法:Thread.sleep();方法 Runnable runnable = new Runnable() { @Override public void run() { while (true) { mHandler.sendEmptyMessage(0); try { Thread.sl

  • Android中判断当前API的版本号方法

    Android中由于不同版本API会有一些变化,导致一些较早版本可能不支持新的方法,或者某些功能处理过程不太一样,需要判断当前版本然后进行适当的处理. 那么,如何判断当前API的版本号呢? 例如判断api版本号是否大于等于19: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {...} 其中,Build.VERSION_CODES.KITKAT = 19 Build.VERSION.SDK_INT是什么: public stat

  • Android 中TextureView和SurfaceView的属性方法及示例说明

    目录 实践过程 SurfaceView属性和方法 TextureView属性和方法 TextureView示例 SurfaceView示例 实践过程 SurfaceView属性和方法 surfaceCreated(@NonNull SurfaceHolder holder):surface创建时回调 surfaceDestroyed(@NonNull SurfaceHolder holder):surface销毁时回调 surfaceChanged(@NonNull SurfaceHolder

  • Android中Activity常用功能设置小结(包括全屏、横竖屏等)

    本文实例讲述了Android中Activity常用功能设置小结(包括全屏.横竖屏等).分享给大家供大家参考,具体如下: Activity全屏设置 方式1:AndroidManifest.xml 复制代码 代码如下: <activity android:name="myAcitivty"  android:theme="@android:style/Theme.NoTitleBar.Fullscreen" /> 方式2:代码实现 复制代码 代码如下: re

随机推荐