`

android rfid 的开发

阅读更多

 

                昨天同事找我帮忙看看 rfid 开发的时候,一扫描就直接弹出activity的问题。

                网上也有蛮多例子,但是能直接拿来参考写实际项目的没几个,系统提供的demo呢,一扫描标签就弹出activity,也是开发中不想要的。于是进入苦逼模式,进过分析和翻资料、百度、终于解决了。下面是代码:

 

   先看项目图片, 我是直接用demo修改的:


 

 

1、清单文件: 

      需求添加权限啦什么,自己看啊,

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.nl.nfcdemo"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="10"
        android:targetSdkVersion="15" />
    <!-- 添加nfc权限 -->
    <uses-permission android:name="android.permission.NFC" />

    <uses-feature
        android:name="android.hardware.nfc"
        android:required="true" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.nl.nfcdemo.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
    </application>

</manifest>

 

 

    2、MainAcivity类。

 

   

package com.nl.nfcdemo;

import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.IntentFilter.MalformedMimeTypeException;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.nfc.tech.MifareClassic;
import android.nfc.tech.NfcV;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

    private final String ACTION_NAME = "android.nfc.action.TECH_DISCOVERED";  
    NfcAdapter nfcAdapter;
    TextView   promt;
    private PendingIntent mPendingIntent;
    private IntentFilter [] mIntentFilters;
    private String[][] mTechLists;
    
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate (savedInstanceState);
        setContentView (R.layout.activity_main);
        
        promt = (TextView) findViewById (R.id.promt);
         
        // 获取默认的NFC控制器
        nfcAdapter = NfcAdapter.getDefaultAdapter (this);
        if (nfcAdapter == null) {
            promt.setText ("设备不支持NFC!");
            finish ();
            return;
        }
        if (!nfcAdapter.isEnabled ()) {
            promt.setText ("请在系统设置中先启用NFC功能!");
            finish ();
            return;
        }
        
        initNFC();
    }
    
    
    

    /**
     *@Description: 初始化
     *@Author:杨攀
     *@Since: 2016年4月27日下午5:38:15
     */
    private void initNFC(){
        //绑定Intent
        Intent mIntent = new Intent (ACTION_NAME);
        mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
        
        IntentFilter techFilter = new IntentFilter (nfcAdapter.ACTION_TECH_DISCOVERED);
        try {
            techFilter.addDataType ("text/plain");
            mIntentFilters = new IntentFilter[]{techFilter};
        } catch (MalformedMimeTypeException e) {
            e.printStackTrace();
        }
        
        mTechLists  = new String[][] { 
                new String[] {"android.nfc.tech.NfcA"},
                new String[]{"android.nfc.tech.NfcB"},
                new String[]{"android.nfc.tech.NfcF"},
                new String[]{"android.nfc.tech.NfcV"},
                new String[]{"android.nfc.tech.Ndef"},
                new String[]{"android.nfc.tech.NdefFormatable"},
                new String[]{"android.nfc.tech.IsoDep"},
                new String[]{"android.nfc.tech.MifareClassic"},
                new String[]{"android.nfc.tech.MifareUltralight"}
                };
    }

    /**
     *@Description: 拦截系统的 intent, 然后触发读写操作
     *@Author:杨攀
     *@Since: 2016年4月27日下午5:08:20
     *@param intent
     */
    @Override
    protected void onNewIntent(Intent intent){
        super.onNewIntent (intent);
        // 得到是否检测到ACTION_TECH_DISCOVERED触发
        if (NfcAdapter.ACTION_TECH_DISCOVERED.equals (intent.getAction ())) {
            // 处理该intent
            processIntent (intent);
        }
    }


    /**
     *@Description: 注册 意图 
     *@Author:杨攀
     *@Since: 2016年4月27日下午5:34:21
     */
    @Override
    protected void onResume(){
        super.onResume ();
        nfcAdapter.enableForegroundDispatch (this, mPendingIntent, mIntentFilters, mTechLists);
    }

    /**
     *@Description: 窗口关闭的时候,注销意图
     *@Author:杨攀
     *@Since: 2016年4月27日下午5:34:35
     */
    @Override
    protected void onPause(){
        super.onPause ();
        //注销注册
        nfcAdapter.disableForegroundDispatch(this); 
    }
    
    @Override
    protected void onDestroy(){
        super.onDestroy ();
    }
    
    // 字符序列转换为16进制字符串
    private String bytesToHexString(byte[] src){
        StringBuilder stringBuilder = new StringBuilder ("0x");
        if (src == null || src.length <= 0) { return null; }
        char[] buffer = new char[2];
        for ( int i = 0 ; i < src.length ; i++ ) {
            buffer[0] = Character.forDigit ((src[i] >>> 4) & 0x0F, 16);
            buffer[1] = Character.forDigit (src[i] & 0x0F, 16);
            System.out.println (buffer);
            stringBuilder.append (buffer);
        }
        return stringBuilder.toString ();
    }

    /**
     * Parses the NDEF Message from the intent and prints to the TextView
     */
    private void processIntent(Intent intent){
        // 取出封装在intent中的TAG
        Tag tagFromIntent = intent.getParcelableExtra (NfcAdapter.EXTRA_TAG);
        for ( String tech : tagFromIntent.getTechList () ) {
            System.out.println (tech);
        }
        boolean auth = false;
        // 读取TAG
        MifareClassic mfc = MifareClassic.get (tagFromIntent);
        String metaInfo = "本标签的UID为" + Coverter.getUid (intent) + "\n";
        if (mfc != null) {
            try {
                // Enable I/O operations to the tag from this TagTechnology
                // object.
                mfc.connect ();
                int type = mfc.getType ();// 获取TAG的类型
                int sectorCount = mfc.getSectorCount ();// 获取TAG中包含的扇区数
                String typeS = "";
                switch (type) {
                    case MifareClassic.TYPE_CLASSIC:
                        typeS = "TYPE_CLASSIC";
                        break;
                    case MifareClassic.TYPE_PLUS:
                        typeS = "TYPE_PLUS";
                        break;
                    case MifareClassic.TYPE_PRO:
                        typeS = "TYPE_PRO";
                        break;
                    case MifareClassic.TYPE_UNKNOWN:
                        typeS = "TYPE_UNKNOWN";
                        break;
                }
                metaInfo += "卡片类型:" + typeS + "\n共" + sectorCount + "个扇区\n共" + mfc.getBlockCount () + "个块\n存储空间: " + mfc.getSize () + "B\n";
                for ( int j = 0 ; j < sectorCount ; j++ ) {
                    // Authenticate a sector with key A.
                    auth = mfc.authenticateSectorWithKeyA (j, MifareClassic.KEY_DEFAULT);
                    int bCount;
                    int bIndex;
                    if (auth) {
                        metaInfo += "Sector " + j + ":验证成功\n";
                        // 读取扇区中的块
                        bCount = mfc.getBlockCountInSector (j);
                        bIndex = mfc.sectorToBlock (j);
                        for ( int i = 0 ; i < bCount ; i++ ) {
                            byte[] data = mfc.readBlock (bIndex);
                            metaInfo += "Block " + bIndex + " : " + bytesToHexString (data) + "\n";
                            bIndex++;
                        }
                    } else {
                        metaInfo += "Sector " + j + ":验证失败\n";
                    }
                }
            } catch (Exception e) {
                e.printStackTrace ();
            }
        }
        promt.setText (metaInfo);
    }

}

 

 

 

经过运行,可以。我在上传 项目的压缩包。需要的自行下载。

 

 

  • 大小: 15 KB
分享到:
评论

相关推荐

    Android物联网RFID功能的开发

    在Android平台上进行物联网(IoT)开发,RFID(Radio Frequency Identification)技术的应用是一个重要的环节。RFID是一种无线通信技术,能够实现数据交换,通过非接触式的射频信号自动识别目标对象并获取相关数据。本...

    高频RFID读写器二次开发SDK Android版

    诺塔斯智能科技为非接触式IC卡读写器二次开发SDK提供了丰富的版本、针对不同的使用环境,我们提供了C#、C++、JAVA、dephi、Android、JS、Liunx、VC等多个版本,可以根据自己需要有针对性下载。

    手机RFID开发SDK

    android系统开发RFID读写功能的SDK,绝对可用,一般比较难找

    RFID.tar.gz_Android jni_android_android RFID_android rfid_rfid

    android_android RFID_android rfid_rfid"提到了几个关键概念:RFID(Radio Frequency Identification,射频识别技术)、Android JNI(Java Native Interface,Java本地接口)、以及Android平台上的RFID应用开发。...

    android UHF、RFID标签识别

    Android UHF RFID的应用开发涉及以下几个关键知识点: 1. **硬件接口**:开发者需要了解如何与Android设备的RFID硬件模块进行交互,这通常涉及到Android的JNI(Java Native Interface)和C/C++库,以调用底层驱动...

    android 蓝牙 RFID 读写芯片 demo

    开发这样的demo,开发者还需要对蓝牙协议有深入的理解,包括GATT服务和特性定义、蓝牙数据传输的格式以及RFID芯片的特定命令集。此外,由于蓝牙通信可能会受到环境干扰,所以需要考虑重试和错误恢复机制。 总结起来...

    Android studio RFID NFC读写源码

    1、读取ID卡卡号; 2、读写M1IC卡扇区数据、修改卡片密钥、写入UID 3、读写15693协议icode2卡片 4、读写NXP Ntag卡片 5、读写低频T5557卡片 6、读写低频em4305卡片 7、读写低频em4469卡片 8、读写NDEF智能海报

    Android手持机PDA开发、PSAM验证、IC卡读取(CPU、M1等)、RFID读取

    在Android手持机PDA开发领域,开发者经常需要处理与安全认证、智能卡读取和无线射频识别(RFID)相关的任务。以下是对标题和描述中涉及知识点的详细阐述: 1. **Android手持机PDA开发**:Android手持机PDA(个人...

    RFID读写器开发指南-Java1

    《RFID读写器开发指南-Java1》 在当今数字化的世界中,RFID(Radio Frequency Identification)技术作为物联网中的重要一环,被广泛应用于物流、仓储、零售、资产管理等领域。本开发指南针对使用Java语言进行RFID...

    基于RFID与Android平台的物品清点系统.zip

    RFID是一种无线通信技术,能自动识别并追踪物体上的标签,而Android作为全球广泛使用的移动操作系统,为开发此类应用提供了丰富的API和工具。 首先,RFID(Radio Frequency Identification)系统由电子标签(Tag)...

    4412的RFID开发源码

    标题中的“4412的RFID开发源码”指的是一个使用了4412型号RFID模块的软件开发项目,通常这样的项目涉及到无线射频识别技术(Radio Frequency Identification)的编程实现。4412 RFID模块是常用的RFID硬件设备,它...

    android nfc开发 demo

    Android NFC(Near Field Communication)开发是一项让Android设备能够进行近距离无线通信的技术,广泛应用于移动支付、数据传输、智能卡模拟等领域。在这个“android nfc开发 demo”中,我们将会探讨如何在Android...

    android系统RFID扫描App

    在IT行业中,尤其是在移动应用开发领域,"android系统RFID扫描App"是一个具有特定功能的应用程序,它利用了射频识别(RFID)技术来实现一系列仓库管理和物流操作。RFID是一种非接触式自动识别技术,通过无线电信号来...

    NFC_RFID with Android Presentation

    除了Android平台的NFC应用开发,还存在一些非Android平台的NFC黑客技术。这些技术可能涉及更底层的硬件交互,允许对NFC标签进行更深入的操作和控制。但使用这些技术需要注意安全性和隐私保护,避免侵犯他人权益。 ...

    一款RFID读卡器Android app

    一款RFID读卡器Android app,可以用于Android学习

    Android NFC读卡 高频卡 RFID

    本主题主要探讨的是如何使用Android NFC功能读取高频卡(HF Card),即RFID(Radio Frequency Identification)卡片。 一、NFC基础知识 1. NFC工作原理:NFC采用电磁场进行通信,两个设备间距离小于10厘米时,即可...

    RFID演示软件操作手册-Android1

    RFID 演示软件操作手册-Android 在本文档中,我们将详细介绍 RFID 演示软件操作手册的使用说明,旨在帮助用户快速掌握 RFID 演示软件的操作方法和相关配置。 读写器设备网口参数配置 在使用 RFID 演示软件之前,...

    RFIDReader开发资料.rar

    RFIDReader开发资料rar压缩包包含了关于RFID(Radio Frequency Identification)阅读器的开发资源,主要针对Android平台。RFID技术是一种非接触式的自动识别技术,通过射频信号自动识别目标对象并获取相关数据,无需...

Global site tag (gtag.js) - Google Analytics