Android 关于h5与java交互所遇到的问题

本文探讨了H5调用Android Java方法时遇到的问题,包括参数传递、方法调用及返回值处理。强调了Java方法无返回值且需在主线程中进行,推荐使用JSON传递多个参数。同时,分享了关于Mob ShareSDK在微信小程序分享中的常见问题与解决方案。

h5调用java方法,并向java传参。

  • 目前发现是传递不了对象的,如果需要传递对象,要转成json传递
  • 最好传递的参数全是string类型,布尔值用0,1 代替

发现h5无法触发java方法的自查

  • 看有没有加入注解 @JavascriptInterface
  • 遇到一种情况,就是在h5调用java方法里,做了逻辑处理,并调用h5的方法。这时候无法触发。用rxjava切换主线程
     @JavascriptInterface
    fun goToMyTsDevice() {
        Flowable.just("").observeOn(AndroidSchedulers.mainThread()).subscribe {
            if (bleService.isTsHasConnected()) {
                //跳绳已连接,去查询电量
                bleService.writeData(TsBleUtils.writeTsInfo())
            } else {
                val bean = TsDeviceH5Bean("--", "--", "--")
                mWebView.takeH5FuncWithObj(TsConstans.H5_TS_INFO, bean)
            }
        }
    }    

h5调用java方法时,java方法是不能有返回值的。好像是个异步的过程,h5根本收不到return的值。只能调用h5方法传值。最好也有包裹一层线程的切换

java调用h5如果需要传递多个参数,最好的办法是传递一个json,不然的话,调用 val h5Fuc = “javascript:{funcName(’{param}’)” ,引号的问题会让人头大

下面发几个扩展方法

//调用h5的方法
fun X5WebView.takeH5Func(funcName: String) {
    if (funcName.isNullOrEmpty()) {
        BuglyLog.e("X5WebView", "takeH5Func==funcName为空")
    } else {
        val h5Fuc = "javascript:${funcName}()"
        LogUtil.d("java调用h5的方法>>>${h5Fuc}")
        this.loadUrl(h5Fuc)
    }
}

//调用h5的方法携带单个参数
fun X5WebView.takeH5FuncWithParam(funcName: String, param: String) {
    if (funcName.isNullOrEmpty()) {
        BuglyLog.e("X5WebView", "takeH5Func==funcName为空")
    } else {
        val h5Fuc = "javascript:${funcName}(\'${param}\')"
        LogUtil.d("java调用h5的方法>>>${h5Fuc}")
        (this as WebView).loadUrl(h5Fuc)
    }
}


//调用h5的方法携带单个参数
fun X5WebView.takeH5FuncWithObj(funcName: String, param: Any) {
    if (funcName.isNullOrEmpty()) {
        BuglyLog.e("X5WebView", "takeH5Func==funcName为空")
    } else {
        val h5Fuc = "javascript:${funcName}(${Gson().toJson(param)})"
        LogUtil.d("java调用h5的方法>>>${h5Fuc}")
        (this as WebView).loadUrl(h5Fuc)
    }
}

记录下mob shareSdk 微信分享小程序的问题,出现不支持的分享类型的排查

  • 看一下小程序id 一般以gh_开头
  • 查看下有没有设置图片url,一定是网络图片,要不就传null,我看ios就可以,我没试过
  • 一定要用的方法 setWxUserName,setWxPath,setTitle,setText,setImageUrl,setUrl
  • 参考的官方链接1
  • 参考的官方链接2
    public static void weChatToOpenApplets(Context context, String title, String text, int logoId, String appletsID, String appletsPath, String picPathurl) {
        MobSDK.init(context);
        MobSDK.submitPolicyGrantResult(true, null);
        Platform wechat = ShareSDK.getPlatform(Wechat.NAME);
        Wechat.ShareParams SP2 = new Wechat.ShareParams();
        SP2.setWxUserName(appletsID);  //小程序原始ID
        SP2.setWxPath(appletsPath);//分享小程序页面路径
        SP2.setTitle(title);
        SP2.setText(text);
        SP2.setImageUrl(picPathurl);
        SP2.setUrl("https://www.baokaodaxue.com/bkdxapp/");
        SP2.setShareType(Platform.SHARE_WXMINIPROGRAM);
        wechat.share(SP2);
        wechat.setPlatformActionListener(new PlatformActionListener() {
            @Override
            public void onComplete(Platform platform, int i, HashMap<String, Object> hashMap) {
                DialogUtils.showLog(TAG, "onComplete platform:" + platform.getName());

            }

            @Override
            public void onError(Platform platform, int i, Throwable throwable) {
                DialogUtils.showShortToast(context, R.string.ssdk_oks_share_failed);
                DialogUtils.showLog(TAG, "onError platform:" + platform.getName());
                LogUtils.d("分享失败>>" + throwable.getLocalizedMessage());
            }

            @Override
            public void onCancel(Platform platform, int i) {
                DialogUtils.showShortToast(context, R.string.ssdk_oks_share_canceled);
            }
        });
    }

``

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值