用Native.js怎么开发NFC?

2015-06-21 03:54 添加评论 分享
已邀请:

最佳回复

4

最新更新适配见: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);  
            }  
        }  
1

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

1

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

完全修复会发出示例。

0

sail

赞同来自:

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 .  
0

anke

赞同来自:

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

提示 nfcAdapter 是 null

0

phoenix_ch

赞同来自:

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

0

phoenix_ch

赞同来自:

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

0

大山

赞同来自:

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

0

大山

赞同来自:

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

0

路过

0

2313452533@qq.com

赞同来自:

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

0

36707644@qq.com

赞同来自:

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

0

36707644@qq.com

赞同来自:

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

0

1811603882@qq.com

赞同来自:

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

0

jiangbin

赞同来自:

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

0

986504012@qq.com

赞同来自:

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

0

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

0

程序猿是我

赞同来自:

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

要回复问题请先登录注册