jsy-app/utils/nfc.js

296 lines
6.5 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

let NfcAdapter;
let nfc;
let nfcCallback;
let NdefRecord;
let NdefMessage;
let nfcType = 'cardNo'
let nfcwriteText = ''
export function initNFC(callback) {
if (uni.getSystemInfoSync().platform == 'android') {
nfcCallback = callback;
init();
}
}
export function closeNFC() {
nfcCallback = null;
if (uni.getSystemInfoSync().platform == 'android') {
close();
}
}
export function setNfcType(e) {
if (!['cardNo', 'write', 'read'].includes(e)) {
showToast('类型不正确')
return
}
nfcType = e
}
export function setNfcText(e) {
nfcwriteText = e
}
function showToast(msg) {
uni.showToast({
title: msg,
icon: 'none'
})
}
function init() {
try {
let main = plus.android.runtimeMainActivity();
let Intent = plus.android.importClass('android.content.Intent');
let Activity = plus.android.importClass('android.app.Activity');
let PendingIntent = plus.android.importClass('android.app.PendingIntent');
let IntentFilter = plus.android.importClass('android.content.IntentFilter');
NfcAdapter = plus.android.importClass('android.nfc.NfcAdapter');
nfc = NfcAdapter.getDefaultAdapter(main);
if (nfc == null) {
uni.showToast({
title: '设备不支持NFC',
icon: 'none'
})
return;
}
if (!nfc.isEnabled()) {
uni.showToast({
title: '请在系统设置中先启用NFC功能',
icon: 'none'
});
return;
}
let intent = new Intent(main, main.getClass());
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
let pendingIntent = PendingIntent.getActivity(main, 0, intent, 0);
let ndef = new IntentFilter("android.nfc.action.TECH_DISCOVERED");
let tag = new IntentFilter('android.nfc.action.TAG_DISCOVERED');
ndef.addDataType("*/*");
let intentFiltersArray = [ndef, tag];
let techListsArray = [
["android.nfc.tech.MifareClassic"],
["android.nfc.tech.MifareUltralight"]
];
plus.globalEvent.addEventListener("newintent",
function() {
readCardNo();
}, false);
plus.globalEvent.addEventListener("pause", function(e) {
if (nfc) {
nfc.disableForegroundDispatch(main);
}
}, false);
plus.globalEvent.addEventListener("resume", function(e) {
if (nfc) {
nfc.enableForegroundDispatch(main, pendingIntent, intentFiltersArray, techListsArray);
}
}, false);
nfc.enableForegroundDispatch(main, pendingIntent, intentFiltersArray, techListsArray);
} catch (e) {
console.error(e);
}
}
/**
* 监听
*/
function readCardNo() {
NdefRecord = plus.android.importClass("android.nfc.NdefRecord");
NdefMessage = plus.android.importClass("android.nfc.NdefMessage");
var main = plus.android.runtimeMainActivity();
var intent = main.getIntent();
if ("android.nfc.action.TECH_DISCOVERED" == intent.getAction()) {
if (nfcType === 'cardNo') {
__read_no(intent)
} else if (nfcType === 'write') {
__write(intent);
} else {
__read(intent);
}
}
}
/**
* 写入内容
*/
function __write(intent) {
if (!nfcwriteText) {
showToast('写入内容不能为空')
return
}
var text = nfcwriteText
var textBytes = plus.android.invoke(text, "getBytes");
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()) {
nfcCallback({
code: 500,
data: {
type: nfcType,
text: text,
},
message: 'tag不允许写入'
})
return;
}
if (ndef.getMaxSize() < size) {
nfcCallback({
code: 500,
data: {
type: nfcType,
text: text,
},
message: '文件大小超出容量'
})
return;
}
ndef.writeNdefMessage(message);
nfcCallback({
code: 200,
data: {
type: nfcType,
text: text,
},
message: '写入成功'
})
return;
} else {
var format = NdefFormatable.get(tag);
if (format != null) {
try {
format.connect();
format.format(message);
nfcCallback({
code: 500,
data: {
type: nfcType,
text: text,
},
message: '格式化tag并且写入message'
})
return;
} catch (e) {
nfcCallback({
code: 500,
data: {
type: nfcType,
text: text,
},
message: '格式化tag失败'
})
return;
}
} else {
nfcCallback({
code: 500,
data: {
type: nfcType,
text: text,
},
message: 'Tag不支持NDEF'
})
return;
}
}
}
/**
* 读取内容
*/
function __read(intent) {
var Parcelable = plus.android.importClass("android.os.Parcelable");
var rawmsgs = intent.getParcelableArrayExtra("android.nfc.extra.NDEF_MESSAGES");
if (rawmsgs) {
const records = rawmsgs[0].getRecords();
var result = records[0].getPayload();
var s = plus.android.newObject("java.lang.String", result);
if (typeof s === 'string') {
nfcCallback({
code: 200,
data: {
type: nfcType,
text: s,
},
message: '读取成功'
})
} else {
nfcCallback({
code: 500,
data: {
type: nfcType,
text: s,
},
message: '数据为空'
})
}
} else {
nfcCallback({
code: 500,
data: {
type: nfcType,
text: '',
},
message: '数据为空'
})
}
}
/**
* 读取卡号
*/
function __read_no(intent) {
var content = "";
var tag = plus.android.importClass("android.nfc.Tag");
tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
var bytesId = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);
content += "卡片字节数组ID" + tag.getId() + "<br/>";
content += "卡片16进制ID" + ab2hex(tag.getId()) + "<br/>";
var tagid = ab2hex(tag.getId());
content += "卡片16进制翻转ID" + tagid + "<br/>";
content += "卡片10进制卡号" + parseInt(tagid, 16) + "<br/>";
nfcCallback({
code: 200,
data: {
type: nfcType,
id: tagid,
reverseTagId16: tagid,
tagId16: ab2hex(tag.getId()),
bytesIds: tag.getId()
},
message: '读取成功'
})
console.log(content)
}
function ab2hex(buffer) {
const hexArr = Array.prototype.map.call(
new Uint8Array(buffer),
function(bit) {
return ('00' + bit.toString(16)).slice(-2).toUpperCase();
}
)
return hexArr.join('')
}
function close() {
if (nfc) {
let main = plus.android.runtimeMainActivity();
nfc.disableForegroundDispatch(main);
}
}