如何在NativeScript中调用Android AAR文件的方法并处理回调?
嘿,我来帮你梳理下在NativeScript里调用这款Android AAR读卡方法的步骤,亲测可行的那种~
在NativeScript中调用Android AAR异步读卡方法及处理回调
首先确认你已经把AAR正确导入项目了(你提到已经完成这步,那咱们直接进入核心操作)。下面分几个关键环节来走:
1. 获取AAR中的Java类引用
你得先明确AAR里负责读卡的类的完整包名+类名,比如假设它是com.yourcompany.cardreader.CardReader。在NativeScript里,我们可以直接通过全局的android对象引用这个类:
const CardReader = android.com.yourcompany.cardreader.CardReader;
如果用JavaScript的话,去掉类型声明就行,写法逻辑一致。
2. 实现异步回调接口
因为你的AAR是异步返回JSON,它肯定定义了一个回调接口(比如CardReaderCallback),里面会有成功、失败的回调方法,比如onCardReadSuccess(String jsonResult)和onCardReadError(String errorMsg)。在NativeScript里,我们用extend方法来实现这个接口:
const CardReaderCallback = android.com.yourcompany.cardreader.CardReaderCallback; const callback = new CardReaderCallback({ onCardReadSuccess: function(jsonResult) { // 处理返回的JSON字符串 try { const cardDetails = JSON.parse(jsonResult); console.log("读卡成功:", cardDetails); // 这里可以更新UI或者执行你的业务逻辑 } catch (e) { console.error("JSON解析失败:", e); } }, onCardReadError: function(errorMsg) { console.error("读卡失败:", errorMsg); // 提示用户或者做错误兜底处理 } });
注意:如果接口方法的参数是其他Android类型(比如android.os.Bundle),要对应好类型,不过你说返回JSON,用字符串处理就没问题。
3. 初始化实例并调用读卡方法
接下来创建读卡类的实例,调用它的读卡方法,把刚才的回调传进去就行:
import * as application from "@nativescript/core"; const cardReader = new CardReader(); // 假设读卡方法叫startCardReading,参数是上下文+回调 cardReader.startCardReading(application.android.context, callback);
这里的application.android.context是NativeScript提供的全局Android上下文,记得先导入application模块。
4. 避坑注意事项
- 防止内存泄漏:如果这个回调绑定在页面上,一定要在页面销毁时(比如
unloaded生命周期)清理资源,比如调用AAR提供的停止读卡方法:page.on("unloaded", () => { if (cardReader && cardReader.stopCardReading) { cardReader.stopCardReading(); } }); - 权限配置:读卡大概率需要NFC或硬件权限,记得在
App_Resources/Android/src/main/AndroidManifest.xml里添加对应权限,比如:<uses-permission android:name="android.permission.NFC" />
完整示例代码(TypeScript)
import * as application from "@nativescript/core"; export function onPageLoaded(args) { const page = args.object; // 引用AAR中的类和回调接口 const CardReader = android.com.yourcompany.cardreader.CardReader; const CardReaderCallback = android.com.yourcompany.cardreader.CardReaderCallback; // 实现回调逻辑 const callback = new CardReaderCallback({ onCardReadSuccess: function(jsonResult) { try { const cardDetails = JSON.parse(jsonResult); console.log("卡片详情:", cardDetails); // 更新页面UI示例 page.getViewById("cardInfoLabel").text = `卡号:${cardDetails.cardNumber}`; } catch (e) { console.error解析卡片数据失败:", e); page.getViewById("cardInfoLabel").text = "卡片数据解析出错"; } }, onCardReadError: function(errorMsg) { console.error("读卡出错:", errorMsg); page.getViewById("cardInfoLabel").text = `读卡失败:${errorMsg}`; } }); // 启动读卡 const cardReader = new CardReader(); cardReader.startCardReading(application.android.context, callback); // 页面销毁时清理资源 page.on("unloaded", () => { if (cardReader && cardReader.stopCardReading) { cardReader.stopCardReading(); } }); }
只要把示例里的包名、类名、方法名替换成你AAR里的实际名称,就能顺利调用啦~
内容的提问来源于stack exchange,提问作者ShaMoh
相关产品推荐
相关产品推荐

