基于mui框架读取nfc数据_NFC读写标签数据

本文展示了如何使用mui框架监听并处理NFC(近场通信)标签,包括读取和写入数据的步骤。通过监听NFC状态,创建意图过滤器和Tech列表,实现对NFC标签的数据交互。示例代码详细解释了写入和读取NFC数据的过程,以及在不同事件中如何启用和禁用前台调度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

var NfcAdapter;

var NdefRecord;

var NdefMessage;

function listenNFCStatus() {

try{

var main = plus.android.runtimeMainActivity();

var Intent = plus.android.importClass('android.content.Intent');

var Activity = plus.android.importClass('android.app.Activity');

var PendingIntent = plus.android.importClass('android.app.PendingIntent');

var IntentFilter = plus.android.importClass('android.content.IntentFilter');

NfcAdapter = plus.android.importClass('android.nfc.NfcAdapter');

var nfcAdapter = NfcAdapter.getDefaultAdapter(main);

var intent = new Intent(main, main.getClass());

intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

var pendingIntent = PendingIntent.getActivity(main, 0, intent, 0);

var ndef = new IntentFilter("android.nfc.action.TECH_DISCOVERED");

ndef.addDataType("/");

var intentFiltersArray = [ndef];

var techListsArray = [

["android.nfc.tech.IsoDep"],

["android.nfc.tech.NfcA"],

["android.nfc.tech.NfcB"],

["android.nfc.tech.NfcF"],

["android.nfc.tech.Nfcf"],

["android.nfc.tech.NfcV"],

["android.nfc.tech.NdefFormatable"],

["android.nfc.tech.MifareClassi"],

["android.nfc.tech.MifareUltralight"]

];

document.addEventListener("newintent",

function() {

console.error('newintent');

// setTimeout(handle_nfc_data1, 1000);

handle_nfc_data1();

}, false);

document.addEventListener("pause", function(e) {

if (nfcAdapter) {

nfcAdapter.disableForegroundDispatch(main);

console.log('pause');

}

}, false);

document.addEventListener("resume", function(e) {

if (nfcAdapter) {

console.log('resume');

nfcAdapter.enableForegroundDispatch(main, pendingIntent, intentFiltersArray, techListsArray);

}

}, false);

nfcAdapter.enableForegroundDispatch(main, pendingIntent, intentFiltersArray, techListsArray);

}catch(e){

console.error(e);

}

}

function handle_nfc_data1()

{

NdefRecord = plus.android.importClass("android.nfc.NdefRecord");

NdefMessage = plus.android.importClass("android.nfc.NdefMessage");

var main = plus.android.runtimeMainActivity();

var intent = main.getIntent();

console.log("action type:" + intent.getAction());

if("android.nfc.action.TECH_DISCOVERED" == intent.getAction()){

__read(intent);

// if(readyWriteData){

// write(intent);

// readyWriteData = false;

// }else if(readyRead){

//read(intent);

// readyRead = false;

// }

}

}

function showToast(msg){

plus.nativeUI.toast(msg);

}

function __write(intent){

try{

waiting.setTitle('请勿移开标签\n正在写入...');

var text = document.getElementById('text').value;

console.log("text=" + text);

var textBytes = plus.android.invoke(text,"getBytes");

// image/jpeg text/plain

var textRecord = new NdefRecord(NdefRecord.TNF_MIME_MEDIA,

plus.android.invoke("text/plain","getBytes"), plus.android.invoke("","getBytes"), textBytes);

var message = new NdefMessage([textRecord]);

var Ndef = plus.android.importClass('android.nfc.tech.Ndef');

var NdefFormatable = plus.android.importClass('android.nfc.tech.NdefFormatable');

var tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

var ndef = Ndef.get(tag);

if (ndef != null) {

var size = message.toByteArray().length;

console.log("size=" + size);

ndef.connect();

if (!ndef.isWritable()) {

showToast("tag不允许写入");

waiting.close();

return ;

}

if (ndef.getMaxSize() < size) {

showToast("文件大小超出容量");

waiting.close();

return ;

}

ndef.writeNdefMessage(message);

waiting.close();

showToast("写入数据成功.");

return ;

} else {

var format = NdefFormatable.get(tag);

if (format != null) {

try {

format.connect();

format.format(message);

showToast("格式化tag并且写入message");

waiting.close();

return ;

} catch (e) {

showToast("格式化tag失败.");

waiting.close();

return ;

}

} else {

showToast("Tag不支持NDEF");

waiting.close();

return ;

}

}

}catch(e){

console.log("error=" + e);

waiting.close();

alert('写入失败');

}

}

function ByteArrayToHexString(inarray) {

var i, j, tmp;

var hex = [ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A","B", "C", "D", "E", "F" ];

var out = "";

console.log("here");

for (j = 0; j < inarray.length; ++j) {

tmp = inarray[j] & 0xff;

i = (tmp >> 4) & 0x0f;

out += hex[i];

i = tmp & 0x0f;

out += hex[i];

}

return out;

}

function __read(intent){

// waiting.setTitle('请勿移开标签\n正在读取数据...');

//showToast("111");

var Parcelable = plus.android.importClass("android.os.Parcelable");

//showToast("222");

var rawmsgs = intent.getParcelableArrayExtra("android.nfc.extra.NDEF_MESSAGES");

records = rawmsgs[0].getRecords();

var result = records[0].getPayload();

var s = plus.android.newObject("java.lang.String",result);

document.getElementById('content').textContent = document.getElementById('content').textContent+'|'+s;

//手机终端编码

console.log(plus.device.imei);

// console.info(plus.device.uuid);

// 读取ID

var tagid = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);

console.log(ByteArrayToHexString(tagid));

// waiting.close();

}

document.addEventListener('plusready',listenNFCStatus,false);

var waiting ;

var readyWriteData = false;

var readyRead = false;

function writeData(){

var textEle = document.getElementById('text');

if(!textEle.value){

alert('请输入要写入的内容');

return;

}

readyWriteData = true;

waiting = plus.nativeUI.showWaiting("请将NFC标签靠近!");

}

function readData(){

readyRead = true;

waiting = plus.nativeUI.showWaiting("请将NFC标签靠近!");

}

button{

width: 50%;

height: 50px;

}

输入要写入的内容:姓名:张二蛋年龄:29地址:北京海淀区

写入

读取

读取的内容:

**以上代码是在楼主代码基础做的微调

运行显示数据如下:

newintent at index.html:39

resume at index.html:51

action type:android.nfc.action.TECH_DISCOVERED at index.html:67

990004774535110,356760060444444 at index.html:171

here at index.html:148

04BA59423C4D80 at index.html:179

pause at index.html:46

以上可以读取nfc卡号,读取出手机IMEI设备编号,可以将2者加密传输到后台,就可以在绑定手机终端的基础上,实现用户读卡认证(网络传输和加密请自行处理)。

2017-12-16 00:37

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值