黄智勇
黄智勇
  • 发布:2015-06-21 03:54
  • 更新:2019-12-19 16:03
  • 阅读:55718

用Native.js怎么开发NFC?

分类:Native.js
2015-06-21 03:54 负责人:无 分享
已邀请:

最佳回复

Android_磊子

Android_磊子

最新更新适配见:http://ask.dcloud.net.cn/question/12942

大家先尝鲜一下,我仅测试读公交卡了。数据可以出来,具体哪些数据有用,需要专业开发者补充完善分享。在此先谢过了。

function test_nfc(){  
			 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');  
	        var 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.log('newintent');  
						setTimeout(handle_nfc_data,1000);  
					}, 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);  
		}  
		  
		function handle_nfc_data(){  
			var main = plus.android.runtimeMainActivity();  
			var runtimeIntent = main.getIntent();  
			var b = runtimeIntent.getExtras();  
			plus.android.importClass(b);  
			var set = b.keySet();  
			plus.android.importClass(set);  
			var sb;  
			var i = set.iterator();  
			plus.android.importClass(i);  
			var hasNest = i.hasNext();  
			var NfcA = plus.android.importClass("android.nfc.tech.NfcA");  
			var IsoDep = plus.android.importClass("android.nfc.tech.IsoDep");  
			var Tag = plus.android.importClass("android.nfc.Tag");  
			while (hasNest) {  
				var key = i.next();  
				var v = b.get(key);  
				if(v instanceof NfcA){  
					var atqa = v.getAtqa();  
					var sak = v.getSak();  
					var tag = g.getTag();  
					plus.android.importClass(tag);  
					var techList = tag.getTechList();  
					console.log('NfcA Atqa=' + atqa + ";Sak=" + sak + ";techList=" + techList);  
				}else if(v instanceof IsoDep){  
					var tag = g.getTag();  
					plus.android.importClass(tag);  
					var techList = tag.getTechList();  
					console.log('IsoDep techList=' + techList);  
				}else if(v instanceof Tag){  
					var tag = v;  
					var techList = tag.getTechList();  
					console.log('Tag techList=' + techList);  
				}  
				console.log(key + ';v=' + v);  
				sb = key + "=" + v + "\n";  
				hasNest = i.hasNext();  
				console.log('hasNest=' + hasNest);  
			}  
		}
  • 黄智勇 (作者)

    多谢! 我测试一下读取文本. 给dcloud点赞!


    2015-07-18 04:49

  • f***@foxmail.com

    该代码手机连电脑测试,刷nfc标签能够正常,但是打包安装,程序启动后,刷nfc标签程序闪退,是什么原因呢?


    2016-05-03 09:16

  • Android_磊子

    回复 f***@foxmail.com:是何种打包方式,使用HBuilder基座apk测试会有问题吗?


    2016-05-03 13:13

  • 王米仓

    你好,我是在uniapp中用plus.globalEvent.addEventListener监听newintent事件为什么都没有成功触发过该事件求指点


    2019-08-27 22:54

DCloud_heavensoft

DCloud_heavensoft

@DCloud_Android_磊子 用Nexus5调试下,看看哪里出了问题。
@DCloud_App_Array 关注此问题。

  • 黄智勇 (作者)

    我怀疑是系统架构内部报错,因为是扫描NFC小标签的时候,才报错,并且没有进入newintent事件里面来. 似的代码我用Android原生的java代码实现一遍,是成功的,


    2015-07-06 13:59

2***@qq.com

2***@qq.com

原生的Tag类有getId();这个方法可以得到NFC芯片的id,用这个怎么得到NFC的id,在线等,急。。。。。。。。

  • y***@163.com

    你好,知道了怎么获得nfc的id了吗?求教


    2018-04-02 13:19

Android_磊子

Android_磊子

说一下问题原因以及进度:
1,NJS数组传递有局限(已解决)
2,获取到的TAG数据传递有局限

完全修复会发出示例。

  • 黄智勇 (作者)

    感谢! 敬候佳音


    2015-07-09 10:11

  • phoenix_ch

    敬候佳音


    2015-11-10 16:22

黄智勇

黄智勇 (作者)

document.addEventListener("plusready",function(){  
		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');  
	    var 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() {  
	      var args = plus.runtime["arguments"];  
	      alert(args);  
	    }, false);  
	    document.addEventListener("pause", function(e) {  
	      if (nfcAdapter) {  
	        nfcAdapter.disableForegroundDispatch(main);  
	      }  
	    }, false);  
	    document.addEventListener("resume", function(e) {  
	      if (nfcAdapter) {  
	        nfcAdapter.enableForegroundDispatch(main, pendingIntent, intentFiltersArray, techListsArray);  
	      }  
	    }, false);  
	    nfcAdapter.enableForegroundDispatch(main, pendingIntent, intentFiltersArray, techListsArray);  
	},false);
这样会报错,报错信息是 Uncaught SyntaxError: Unexpected token .
anke

anke

测试了下,这行报错
var nfcAdapter = NfcAdapter.getDefaultAdapter(main);

提示 nfcAdapter 是 null

  • 黄智勇 (作者)

    var nfcAdapter = NfcAdapter.getDefaultAdapter(main);

    if(!nfcAdapter) {

    console.error("不支持nfc功能,或者没有开启nfc");

    }


    2015-08-24 15:19

  • 絆苮

    提示nfcAdapter为Null是你的设备不支持NFC


    2016-02-27 11:43

phoenix_ch

phoenix_ch

磊子现在有完整能读写NFC标签的代码了吗

  • Android_磊子

    文章只是起到一个抛砖引玉目的,具体数据还是需要开发者进行研究使用。


    2015-11-10 16:02

Android_磊子

Android_磊子

http://ask.dcloud.net.cn/question/12942此贴针对市面可买到的Tag标签进行了读写数据的适配。

大山

大山

发现联调模式下nfc权限就算勾选也不起作用,必须打包后才行,所以没有办法调试。我打包后在我的手机上读卡会报错。

  • Android_磊子

    1,联调模式下应该是有NFC权限的,你使用的HBuilder哪个版本,可能之前的版本没有加入。

    2,你是什么手机,系统版本?(确定支持NFC)。

    3,读什么卡会报错?报错内容是什么?


    2016-01-27 21:48

大山

大山

我用的最新版本,联调模式下加了权限也提示无权限,打包运行时可以的(手机支持nfc),后台测试发现是使用的公交卡无对应的该类数据,所以报错。

d***@longtop.net
3***@qq.com

3***@qq.com

市面可买到的Tag标签
与公交卡有什么区别?

3***@qq.com

3***@qq.com

两个例子都试过了,均没有任何反应。
求解

  • 7R4ATMqQPOPKjR

    同样的问题,请问后来解决了吗?


    2018-06-26 17:42

1***@qq.com

1***@qq.com

他写的代码可能只有读取他使用的转么NFC芯片,其他的可能就不能,还得看原生android是如何操作NFC的,然后根据原生操作NFC然后翻译成MUI才可以读取NFC

  • y***@163.com

    有例子吗?一脸懵啊,呜呜


    2018-04-02 13:47

jiangbin

jiangbin

这两个异常怎么解决?怎么读取MifareClassic和nfcA的数据。

  • s***@163.com

    同上求解


    2017-12-12 22:17

  • 李世皇朝

    回复 s***@163.com:我已经解决 有偿解决 qq:344162911


    2018-03-20 18:20

  • 李世皇朝

    有偿 344162911


    2018-03-20 18:20

  • 胖南瓜

    回复 李世皇朝: 你真是个睿智,别人写好的东西,有点错误你弄好了还有偿


    2019-07-05 11:49

  • m***@163.com

    解决了吗,老哥,交流交流


    2019-08-15 09:17

  • m***@163.com

    自定义密钥

    var key_A = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00];

    直接使用默认方法中的值,不要用他的默认方法


    2019-08-22 12:16

  • m***@163.com

    我都读可以了,写数据时候,显示

    Uncaught Attempt to invoke virtual method 'java.lang.Class java.lang.reflect.Method.getReturnType()' on a null object reference;at android.nfc.tech.MifareClassic.writeBlock at wrnfc.html


    2019-08-22 12:18

  • 1***@qq.com

    回复 李世皇朝: 穷疯了?


    2019-09-26 17:21

9***@qq.com

9***@qq.com

Uncaught TypeError: Cannot read property '0' of null at nfc_test.html:145这是什么问题

y***@163.com

y***@163.com

怎么读取ncf芯片的id呢,求助啊

  • 7R4ATMqQPOPKjR

    同求,请问后来解决了吗?


    2018-06-26 17:42

程序猿是我

程序猿是我

弱弱的问句 这是在什么平台上跑的 可以直接在html文件用吗 那位大神告知下 谢谢

三岁四颗小虎牙

三岁四颗小虎牙

想问一下。关于这个写入之后NFC卡的秘钥是从哪里处理的?通过咱的程序写入之后写入到哪个分区里面去了?

  • m***@163.com

    请问这个问题解决了吗?


    2019-08-12 10:51

王米仓

王米仓

请教各位大神我是在uniapp中使用
plus.globalEvent.addEventListener("newintent",
function() {
uni.showToast({
title: '监听到了'
})
console.log('newintent');
setTimeout(this.handle_nfc_data1, 1000);
}, false);
为什么都没有成功进入过

zj369

zj369

你好,你写的这个怎么让app进入系统候选列表

phoenix_ch

phoenix_ch

程序启动后,刷标签程序闪退

  • f***@foxmail.com

    打包没有配nfc权限吧 http://ask.dcloud.net.cn/question/18232


    2016-05-03 17:44

该问题目前已经被锁定, 无法添加新回复