从Ionic访问android本机代码
我已经创建了我的Android应用程序Ionic,但后来意识到我想从我的Android设备上访问一些硬件,这可以通过Android本机代码实现,那么有没有办法从Ionic应用程序(Apache Cordova)上访问Android代码?您可以使用JS接口桥从JS控制器调用本机方法:从Ionic访问android本机代码,android,cordova,ionic-framework,cross-platform,cordova-plugins,Android,Cordova,Ionic Framework,Cross Platform,Cordova Plugins,我已经创建了我的Android应用程序Ionic,但后来意识到我想从我的Android设备上访问一些硬件,这可以通过Android本机代码实现,那么有没有办法从Ionic应用程序(Apache Cordova)上访问Android代码?您可以使用JS接口桥从JS控制器调用本机方法: 在MainActivity中定义JavaScriptHandler类并定义 此类中的JavascriptInterface方法。此接口现在将起作用 作为webview和本机容器之间的桥梁 将此Javascript处理
可以使用任意名称在javascript中公开JavaScriptHandler。在我的例子中,我使用了“NativeCall”。我在我的android代码中也使用了其他依赖项,就像打印条形码和访问打印机一样,因此,我想使用ICONIC3应用程序中的所有代码,您可能需要考虑实现自定义CordoVA插件。是的,但在插件的情况下,如何管理多个文件和依赖的JAR文件,我不确定您所谈论的多个文件。你能说得更准确些吗?但是jar可以放在platforms->android->app中的lib文件夹中,并将这一行添加到build.gradle文件中进行编译:implementation fileTree(dir:'libs',include:'*.jar')。同样,依赖项也可以添加到build.gradle中。谢谢,我从你的评论中得到了这个想法,我将尝试一下
public class MainActivity extends CordovaActivity {
public static Context mContext;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = MainActivity.this;
mLoader = new ProgressDialog(mContext);
// 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);
final WebView webView = (WebView) appView.getEngine().getView();
webView.addJavascriptInterface(this.getJavaScriptHandler(), "NativeCall");
}
public JavaScriptHandler getJavaScriptHandler() {
return new JavaScriptHandler(this.getApplicationContext());
}
public class JavaScriptHandler {
CordovaActivity parentActivity;
private Context mContext;
public JavaScriptHandler(final Context context) {
this.mContext = context;
}
@JavascriptInterface
public String mNativeFunction() {
return getDeviceName;
}
}
public static String getDeviceName() {
String brand = Build.BRAND;
String manufacturer = Build.MANUFACTURER;
String model = Build.MODEL;
if (model.startsWith(brand)) {
return (model);
}
return (brand) + " " + model;
}
}
MyDemoApp.controller('SomePageController', function ($scope) {
$scope.deviceName = "";
$scope.getDeviceName = function () {
$scope.deviceName = NativeCall.mNativeFunction();
}
})