如何从 WebView Cordova AngularJS 控制器访问/发送数据到 MainActivity?
Posted
技术标签:
【中文标题】如何从 WebView Cordova AngularJS 控制器访问/发送数据到 MainActivity?【英文标题】:How cann I access/send data to MainActivity from WebView Cordova AngularJS controller? 【发布时间】:2018-09-20 12:41:33 【问题描述】:如何将数据从 angularjs 控制器发送到 android Studio 中的 MainActivity。
这是 MainActivity:
package at.restaurantKellner;
import android.os.Bundle;
import org.apache.cordova.*;
public class MainActivity extends CordovaActivity
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
// enable Cordova apps to be started in the background
Bundle extras = getIntent().getExtras();
if (extras != null && extras.getBoolean("cdvStartInBackground", false))
moveTaskToBack(true);
// Set by <content src="index.html" /> in config.xml
loadUrl(launchUrl);
这是我的 Angular controller.js:
'use strict';
window.App.Module = angular.module('AppModule.tisch-details', ['ngRoute']);
window.App.Ctrls.controller('tisch-detailsCtrl', ['$scope', '$http', '$location', '$timeout', '$route', '$rootScope', 'ngDialog', 'czs', '$sce', '$q', 'user', function ($scope, $http, $location, $timeout, $route, $rootScope, ngDialog, czs, $sce, $q, user)
//I want to send this information to MainActivity
$scope.dataForMainActivity = "Data to send";
]);
有人可以给我写一个示例代码吗?我将不胜感激
【问题讨论】:
【参考方案1】:创建 javascriptWebInterface 类。它可以是一个内部类。
public class JsInterface
Context mContext;
JsInterface(Context c)
mContext = c;
@JavascriptInterface // << This annotation makes it works!
public void myFunc(String toast)
Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
将该类注册到 webView。 Cordova 将其隐藏在 appView 中。
package at.restaurantKellner;
import android.os.Bundle;
import org.apache.cordova.*;
public class MainActivity extends CordovaActivity
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
super.init(); //ADD super.init
// enable Cordova apps to be started in the background
Bundle extras = getIntent().getExtras();
if (extras != null && extras.getBoolean("cdvStartInBackground", false))
moveTaskToBack(true);
// INJECT OUR JS INTERFACE HERE!
WebView webView = (WebView) this.appView.getEngine().getView();
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new JsInterface(webView.getContext()), "android");
// Set by <content src="index.html" /> in config.xml
loadUrl(launchUrl);
像普通的 javascript 调用一样进行调用。最好检查一下android是否存在。请注意,android
是窗口中的 javascript 对象。如果您在 Angular 的内部范围内,您可能需要通过window.android
访问它。
if (typeof android !== 'undefined' && android !== null)
android.myFunc('hello');
else
console.log('Not in android webbox');
【讨论】:
感谢您的快速回复,不幸的是,当我添加此内容时,应用程序崩溃了。这是我的android项目:ANdroid Project我哪里出错了? 在super.onCreate(savedInstanceState);
之后添加super.init();
有效!谢谢你。我不擅长安卓,你救了我的命。事实上,我需要将 JSON 数据从 POS 打印机发送到 SDK,然后通过 Wifi 将其发送到打印机。如果我需要帮助,我可以在这里联系您吗?非常感谢
@ExyuPortal 很高兴我能提供帮助。您可以随时发布问题。我相信这里有很多人可以回答你的问题。
嗨,digitake,我再次需要帮助。我不知道如何将打印机 SDK 与应用程序连接起来。这是用于打印机的Android SDK:SDK Download我需要先连接打印机metapacePrinter = new MetapacePrinter(this, mHandler, null); String hostx; hostx = "192.168.1.25"; metapacePrinter.connect(hostx, 9100, 5000);
然后将JSON数据发送到打印,它在PrintTextActivity类中...... private void printText()......你能帮我吗? 以上是关于如何从 WebView Cordova AngularJS 控制器访问/发送数据到 MainActivity?的主要内容,如果未能解决你的问题,请参考以下文章
如何检测 Cordova WebView 何时完全完成加载?
如何在 android webview 中实现 phonegap/cordova?
尝试退出插件 webview 时,带有集成插件的 Cordova 应用程序在 webview 上崩溃(android 测试)