uniapp H5与原生安卓的数据互通和方法调用

1、准备

我这里是uniapp与原生安卓之间的相互调用,也就是原生安卓内嵌H5页面,下面先来准备一下安卓端的代码。
(1)、初始化的MainActivity 类定义一个 WebView

private WebView webView;

(2)、初始化的方法onCreate 设置 WebView 的参数及各种设置,这里主要是开启js 的调用 和添加H5调用的类,相当于在项目启动的时候就加载H5需要调用的类。

 @Override
    @SuppressLint("JavascriptInterface")
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        CONTEXT = this.getBaseContext();

			 // H5调用的类,deviceInfo  是给类取得别名,调用的时候用到
        webView.addJavascriptInterface(new DeviceInfo(), "deviceInfo");
        
       // 添加js支持
        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
    }

(3)、H5调用的类,

public class DeviceInfo {
				// H5调用的方法,这里的方法可以自己定义,和java的写法一样。
        @JavascriptInterface
        public String getDeviceId() {
            //获取手机的Serial码
            String deviceId = Build.SERIAL;
            return deviceId;
        }

        @JavascriptInterface
        public String getDeviceInfo() {
            //获取手机的Serial码
            String serialNumber = Build.SERIAL;
            String deviceType = Build.DEVICE;
            String deviceName = Build.PRODUCT;
            Map<String,String> map = new HashMap<>();
            map.put("serialNumber",serialNumber);
            map.put("deviceType",deviceType);
            map.put("deviceName",deviceName);
            String toJson = new Gson().toJson(map);
            return toJson;
        }
    }

这样前期的准备就做好了,当然原生安卓项目的创建这些我这里的就不讲了。

2、H5调原生安卓

1、H5代码

我这里是用uniapp写的H5页面,在 methods 模块 的方法里面,需要调原生安卓的地方:

let  deviceId = window.deviceInfo.getDeviceId();

注意: window 是固定写法,deviceInfo 上面的取得类别名,getDeviceId 就是我们需要调的这个类里面的方法名了,这里我没有传参数,需要传参的直接加上实参参数就可以了,对应的方法也加上形参就可以了。

  // H5调用的类,deviceInfo  是给类取得别名,调用的时候用到
        webView.addJavascriptInterface(new DeviceInfo(), "deviceInfo");
2、原生安卓代码

这里就是上面写的代码,这里需要讲的就是需要返回参数到H5的直接 return 回去就可以了。

public class DeviceInfo {
        @JavascriptInterface
        public String getDeviceId() {
            //获取手机的Serial码
            String deviceId = Build.SERIAL;
            return deviceId;
        }

        @JavascriptInterface
        public String getDeviceInfo() {
            //获取手机的Serial码
            String serialNumber = Build.SERIAL;
            String deviceType = Build.DEVICE;
            String deviceName = Build.PRODUCT;
            Map<String,String> map = new HashMap<>();
            map.put("serialNumber",serialNumber);
            map.put("deviceType",deviceType);
            map.put("deviceName",deviceName);
            String toJson = new Gson().toJson(map);
            return toJson;
        }
    }

3、原生安卓调H5方法

这里我也网上找了很久,都是原生的H5 js 写法,因为我是用uniapp写的,所以和原生js写法不一样,这重点讲一下,我踩了一个大坑。
(1)原生安卓代码。
首先讲一下安卓端的代码,其实很简单。

// initializeData 为H5的方法,也就是uniapp的方法, payStatus 为需要传的参数。 
webView.loadUrl("javascript:initializeData(" + payStatus + ")");

安卓端代码就完了,就这么简单,和网上找的帖子一样,都是这么调的,但是当时不知道的是,H5的方法怎么写。
(2)uniapp H5 的方法。
我的写法:在 mounted模块

mounted: function() {
			// window 这应该是固定写法,initializeData  为原生安卓端调用的方法。
			window.initializeData =function (e) {
				// e为传回来的参数
				// 自己的业务逻辑处理
			}
		},

刚刚在网上看到了一种写法,应该也可以的

created() {
      window.getResult = this.getResult //注册到windows  调完原生方法之后 走h5的方法
},
methods: {
      getResult(res){
      //调用完成原生方法后,会走到这个方法
      }
}

好了,这就是原生安卓与uinapp H5的参数和方法的相互调用的全部过程
uniapp H5与原生安卓的数据互通和方法调用

posted @ 2022-09-21 17:39  似水流云  阅读(2629)  评论(0编辑  收藏  举报