从Ionic访问android本机代码

从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处理

我已经创建了我的Android应用程序Ionic,但后来意识到我想从我的Android设备上访问一些硬件,这可以通过Android本机代码实现,那么有没有办法从Ionic应用程序(Apache Cordova)上访问Android代码?

您可以使用JS接口桥从JS控制器调用本机方法:

  • 在MainActivity中定义JavaScriptHandler类并定义 此类中的JavascriptInterface方法。此接口现在将起作用 作为webview和本机容器之间的桥梁
  • 将此Javascript处理程序添加到应用程序webview
  • 定义需要从控制器调用的方法
  • 下面是扩展CordovaActivity的MainActivity代码:


    可以使用任意名称在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();
      }
    })