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