uni-app中用Native.js怎么开发NFC?

发布于 1周前 作者 yibo5220 来自 Uni-App

uni-app中用Native.js怎么开发NFC?

48 回复

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

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

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

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

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

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

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

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

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

说一下问题原因以及进度: 1,NJS数组传递有局限(已解决) 2,获取到的TAG数据传递有局限
完全修复会发出示例。

感谢! 敬候佳音

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 .

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

var nfcAdapter = NfcAdapter.getDefaultAdapter(main); if(!nfcAdapter) { console.error(“不支持nfc功能,或者没有开启nfc”); }

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

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

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

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

1,联调模式下应该是有NFC权限的,你使用的HBuilder哪个版本,可能之前的版本没有加入。 2,你是什么手机,系统版本?(确定支持NFC)。 3,读什么卡会报错?报错内容是什么?

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

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

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

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

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

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

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

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

有偿 344162911

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

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

自定义密钥 var key_A = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00]; 直接使用默认方法中的值,不要用他的默认方法

我都读可以了,写数据时候,显示 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

回复 李世皇朝: 穷疯了?

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

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

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

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

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

请问这个问题解决了吗?

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

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

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

在uni-app中使用Native.js开发NFC功能,可以通过调用原生API来实现。以下是一个基本的示例,展示如何使用Native.js来读取NFC标签。需要注意的是,NFC功能依赖于设备的硬件支持,并且需要在App端(如微信小程序不支持)进行实现。

步骤概述

  1. 确认环境:确保你的uni-app项目已经配置好Native.js支持,并且运行在支持NFC的Android设备上。
  2. 编写Native.js代码:使用JavaScript调用Android的NFC API。
  3. 集成到uni-app:将Native.js代码集成到你的uni-app项目中。

示例代码

1. 配置Native.js支持

manifest.json中确保已经启用了5+ App(HBuilderX打包)的相关权限,比如NFC权限。

"plus": {
    "distribute": {
        "android": {
            "permissions": [
                "android.permission.NFC"
            ]
        }
    }
}

2. 编写Native.js代码

在你的uni-app项目中创建一个新的JavaScript文件,比如nfc.js,用于封装NFC相关的Native.js调用。

// nfc.js
export function startNfcReader() {
    plus.android.importClass('android.nfc.NfcAdapter');
    plus.android.importClass('android.content.Context');
    plus.android.importClass('android.app.PendingIntent');
    plus.android.importClass('android.content.Intent');

    const context = plus.android.runtimeMainActivity();
    const nfcAdapter = plus.android.invoke(NfcAdapter, 'getDefaultAdapter', context);

    if (!nfcAdapter) {
        console.error('NFC硬件不可用');
        return;
    }

    nfcAdapter.enableForegroundDispatch(
        context,
        plus.android.newObject(PendingIntent, 'getActivity', context, 0, plus.android.newObject(Intent)),
        new plus.android.implementation.Array([
            plus.android.invoke(NfcAdapter, 'ACTION_TAG_DISCOVERED'),
            plus.android.invoke(NfcAdapter, 'ACTION_NDEF_DISCOVERED')
        ], plus.android.Array),
        null
    );

    nfcAdapter.onNewIntent = function(intent) {
        const tag = intent.getParcelableExtra(plus.android.invoke(NfcAdapter, 'EXTRA_TAG'));
        if (tag) {
            console.log('读取到NFC标签:', tag);
            // 这里可以添加处理NFC标签的逻辑
        }
    };
}

3. 集成到uni-app

在你的页面或组件中调用startNfcReader函数。

// 在你的页面或组件的script部分
import { startNfcReader } from '@/common/nfc.js'; // 假设nfc.js放在common目录下

export default {
    onLoad() {
        #ifdef APP-PLUS
        startNfcReader();
        #endif
    }
}

注意事项

  • NFC功能只能在支持NFC的Android设备上使用。
  • 在实际开发中,你可能需要处理更多的NFC标签类型和异常情况。
  • 确保在调用NFC功能前已经获得了用户的权限同意。

通过上述代码,你可以在uni-app中使用Native.js来读取NFC标签。根据实际需求,你可以进一步扩展和处理NFC数据。

回到顶部