• 批发行业进销存-webview 读取NFC,会员卡 源码CyberWinApp-SAAS 本地化及未来之窗行业应用跨平台架构


    一、混合应用开发

    混合应用顾名思义就是网页html和原生APP共同作用的结果

    好处在一既有web的跨平台优势(安卓、苹果,电脑、国产电脑、平板电脑,自助机都能用)

    好处二可以离线使用,比较稳定

    好处三可以与本地硬件交互

    二、web调用本地资源

    web调用本地交互采用jsapi

    代码示例

     public WebView cwpd_Web;

       java未来之窗内部插件 csp = new java未来之窗内部插件d(main_instance);
    
     webview.addJavascriptInterface(new 未来之窗交互(this, this), "未来之窗交互名称"); 

    js调用方式

    未来之窗交互名称.读取酒店门锁(酒店门锁厂家)

    三、android调用web

    android 一般不知道当前web情况,一般采用2中方式

    1.web不断轮询查询检测结果

    缺点:消耗web资源,优点,技术要求低

    2.采用webview内部通知机制

    优点:不消耗内部资源,缺点:需要了解系统底层

    四、webview调用NFC

    权限

    1. android:name="android.permission.NFC" />
    2. <uses-feature android:name="android.hardware.nfc" />

    nfc 资源库

    1. import android.nfc.NdefMessage;
    2. import android.nfc.NdefRecord;
    3. import android.nfc.NfcAdapter;
    4. import android.nfc.Tag;
    5. import android.nfc.tech.MifareClassic;
    6. import android.nfc.tech.MifareUltralight;
    7. import android.nfc.tech.NfcA;

    nfc 服务

    1. private NfcAdapter NFC_mAdapter2023;
    2. private NdefMessage mNdefPushMessage;
    3. private PendingIntent mPendingIntent;

    nfc 服务启动

    1. resolveIntent(getIntent());
    2. NFC_mAdapter2023 = NfcAdapter.getDefaultAdapter(this);
    3. //初始化NfcAdapter
    4. LogToFile.d_windows("nfc","nfc调式记录","初始化NfcAdapter");
    5. if (NFC_mAdapter2023 == null) {
    6. // showMessage("无设备", "没有NFC设备");
    7. // finish();
    8. // return;
    9. }else {
    10. LogToFile.d_windows("nfc","nfc调式记录","NFC正常");
    11. //初始化PendingIntent
    12. mPendingIntent = PendingIntent.getActivity(this, 0,
    13. new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
    14. // mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()), 0);
    15. LogToFile.d_windows("nfc","nfc调式记录","初始化PendingIntent");
    16. mNdefPushMessage = new NdefMessage(new NdefRecord[]{
    17. newTextRecord(
    18. "Message from NFC Reader :-)", Locale.ENGLISH, true)}
    19. );
    20. }

    android宿主

    1. protected void onResume() {
    2. if (NFC_mAdapter2023 != null) {
    3. if (!NFC_mAdapter2023.isEnabled()) {
    4. showWirelessSettingsDialog();
    5. }
    6. NFC_mAdapter2023.enableForegroundDispatch(this, mPendingIntent, null, null);
    7. NFC_mAdapter2023.enableForegroundNdefPush(this, mNdefPushMessage);
    8. }
    9. }

    五、android 检测NFC并通知web html

    1. private void resolveIntent(Intent intent) {
    2. String action = intent.getAction();
    3. if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)
    4. || NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)
    5. || NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
    6. Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
    7. NdefMessage[] msgs;
    8. if (rawMsgs != null) {
    9. msgs = new NdefMessage[rawMsgs.length];
    10. for (int i = 0; i < rawMsgs.length; i++) {
    11. msgs[i] = (NdefMessage) rawMsgs[i];
    12. }
    13. } else {
    14. // Unknown tag type
    15. byte[] empty = new byte[0];
    16. byte[] id = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);
    17. Tag tag = (Tag) intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
    18. String 未来之窗NFC=dumpTagData(tag);
    19. // LogToFile.d_windows();
    20. LogToFile.d_windows("nfc","nfc调式记录",未来之窗NFC);
    21. String 未来之窗反向js2 = "javascript:" + "未来之窗人工智能交互" + "(\"nfc_reader\",`" + 未来之窗NFC + "`)";
    22. /*
    23. webview.evaluateJavascript(未来之窗反向js, new ValueCallback() {
    24. @Override
    25. public void onReceiveValue(String value) {
    26. // LogUtil.e(TAG, "getPayId onReceiveValue " + functionName);
    27. }
    28. }
    29. );
    30. */
    31. cwpd_Web.evaluateJavascript(未来之窗反向js2, new ValueCallback() {
    32. @Override
    33. public void onReceiveValue(String value) {
    34. // LogUtil.e(TAG, "getPayId onReceiveValue " + functionName);
    35. }
    36. }
    37. );
    38. byte[] payload = 未来之窗NFC.getBytes();
    39. NdefRecord record = new NdefRecord(NdefRecord.TNF_UNKNOWN, empty, id, payload);
    40. NdefMessage msg = new NdefMessage(new NdefRecord[] { record });
    41. msgs = new NdefMessage[] { msg };
    42. // mTags.add(tag);
    43. }
    44. // Setup the views
    45. // buildTagViews(msgs);
    46. }
    47. }

    六、web接受端

    1. function cyberWin_Device_AIOT_Monitor(action,param){
    2. // alert("类型:"+action);
    3. // alert(param);
    4. var 未来之窗json = eval("("+param+")");//转换为json对象
    5. // alert(未来之窗json.id_dec);
    6. }

    到此设备上刷卡web就会通知

  • 相关阅读:
    MySQL 索引
    pytorch深度学习入门
    主谓一致基本语法
    前端面试HTML和CSS总结,这一篇就够了!
    SQL语句优化、mysql不走索引的原因、数据库索引的设计原则
    Linux学习-29-用户组信息相关命令
    面向面试知识-消息队列
    ​软考-高级-信息系统项目管理师教程 第四版【第16章-项目采购管理-思维导图】​
    使用Docker搭建Apache Kafka环境
    8-8归并排序
  • 原文地址:https://blog.csdn.net/cybersnow/article/details/141099587