Android与H5界面的交互(参数互传)以及遇到的一些问题

来源:互联网 发布:seo免费学习网 编辑:程序博客网 时间:2024/06/06 00:22

前言

在开发项目时,有部分界面是H5界面,原本以为直接加载H5界面就能搞定,后来还是遇到参数互传问题了,然后网上意见不一,只好自己摸索,下面就给大家聊聊我遇到的问题~~~

1.先给大家看看成功之后的界面跳转:

这里写图片描述

解释一下:
界面跳转流程: 首页的限时特卖–>限时特卖的H5界面–>商品详情页.

(1)由App原生界面跳转

由首页的限时特卖进入显示特卖的H5界面:直接将后台返回的H5链接加载到WebView界面,对大家来说肯定没有丝毫难度吧,在这里就不粘代码了

(2)从H5的商品列表页进入到商品详情页时需要商品的id,这就真正的涉及到与H5的交互了,看代码:

public class MyGoods {    Context context;    public MyGoods(Context context) {        this.context = context;    }    //该方法将暴露给js调用,打来商品详情页    @JavascriptInterface    public void getCall(String goodsid) {        Intent intent = new Intent(context, GoodsDetailsAct.class);        intent.putExtra("goods_id", goodsid);        context.startActivity(intent);    }}

定义一个全局的类,在这个类里面只需要写一个Intent,打开商品详情页,并将id传过去;MyGoods中的方法使用@JavascriptInterface修饰,因此会将这两个方法暴露给JS脚本,则允许JS脚本通过MyGood来调用MyGoods里面的方法:

然后我自己封装了一个关于公共的加载WebView的类:
初始化完成之后作如下操作:

WVJBWebView.getSettings().setJavaScriptEnabled(true);WVJBWebView.addJavascriptInterface(new MyGoods(PublicWebViewAct.this), "MyGood");

第一行代码开启了JS调用Android方法的功能;第二行则负责将Android应用中的MyGoods对象暴露给JS脚本;

前端的同学在他的代码里只写了一下这行代码:

MyGood.getCall(goods_id);

最后就大功告成了,点击的条目的Id就传过来了~~~

2.在与H5交互过程中遇到其他的问题

(1) 我们H5界面比较多,然后我们的界面的标题栏用的都是原生的,然后前端同学就把自己H5界面的标题栏给干掉了,之后就需要获取标题,然后就在网上找到了这个方法:

这里写图片描述

每次加载新的界面就能获取到该H5界面的标题,当然了,这也离不开H5同学的配合哦~~

(2) 关于H5界面在Android5.0 以上系统加载报错的问题:

if (android.os.Build.VERSION.SDK_INT >= 21) {            WVJBWebView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);        }

在加载数据之前做个判断就行了,设置上面的属性就没问题了;

(3) 在一个比较复杂的H5界面需要调用系统的相册和摄像头,在调用时 APP崩溃:

WVJBWebView.setWebChromeClient(new WebChromeClient() {            // For Android < 3.0            public void openFileChooser(ValueCallback<Uri> valueCallback) {                uploadMessage = valueCallback;                openImageChooserActivity();            }            // For Android  >= 3.0            public void openFileChooser(ValueCallback valueCallback, String acceptType) {                uploadMessage = valueCallback;                openImageChooserActivity();            }            //For Android  >= 4.1            public void openFileChooser(ValueCallback<Uri> valueCallback,                                        String acceptType, String capture) {                uploadMessage = valueCallback;                openImageChooserActivity();            }            // For Android >= 5.0            @Override            public boolean onShowFileChooser(WebView webView,                                             ValueCallback<Uri[]> filePathCallback,                                             WebChromeClient.FileChooserParams fileChooserParams) {                uploadMessageAboveL = filePathCallback;                openImageChooserActivity();                return true;            }        });

打开图库的方法:

    private void openImageChooserActivity() {        Intent i = new Intent(Intent.ACTION_GET_CONTENT);        i.addCategory(Intent.CATEGORY_OPENABLE);        i.setType("image/*");        startActivityForResult(Intent.createChooser(i,"ImageChooser"),FILE_CHOOSER_RESULT_CODE);    }@Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        if (requestCode == FILE_CHOOSER_RESULT_CODE) {            if (null == uploadMessage && null == uploadMessageAboveL) return;            Uri result = data == null || resultCode != RESULT_OK ? null : data.getData();            if (uploadMessageAboveL != null) {                onActivityResultAboveL(requestCode, resultCode, data);            } else if (uploadMessage != null) {                uploadMessage.onReceiveValue(result);                uploadMessage = null;            }        }    }    @TargetApi(Build.VERSION_CODES.LOLLIPOP)    private void onActivityResultAboveL(int requestCode, int resultCode, Intent intent) {        if (requestCode != FILE_CHOOSER_RESULT_CODE || uploadMessageAboveL == null)            return;        Uri[] results = null;        if (resultCode == Activity.RESULT_OK) {            if (intent != null) {                String dataString = intent.getDataString();                ClipData clipData = intent.getClipData();                if (clipData != null) {                    results = new Uri[clipData.getItemCount()];                    for (int i = 0; i < clipData.getItemCount(); i++) {                        ClipData.Item item = clipData.getItemAt(i);                        results[i] = item.getUri();                    }                }                if (dataString != null)                    results = new Uri[]{Uri.parse(dataString)};            }        }        uploadMessageAboveL.onReceiveValue(results);        uploadMessageAboveL = null;    }

在加载WebView时遇到的主要问题就是这些了,只是给大家单纯的做一个实用的代码总结,做到上手能用就行,想了解更多底层原理的同学需要自己努力了哦~~我只是个小菜鸟

需要我那个公共的WebView的同学可以私信或者加我QQ哦,祝大家工作顺利~~~

3 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 吸顶灯led灯坏了怎么办 车底盘塑料被刮怎么办 汽车门电机坏了怎么办 宁波北仑普高差三分该怎么办 上班的地方甲醛味很重怎么办 公司不给员工交社保怎么办 户口转到学校毕业了怎么办 外地户口转到北京档案怎么办 隧道防水板过紧怎么办 到国企没报到证怎么办 车子锁了油箱盖能开怎么办 单位不接受档案和户口怎么办 完税凭证弄丢了怎么办 育种玉米公本早了怎么办 网银转账打错了怎么办 转账名字打错了怎么办 普通转账名字打错了怎么办 银行账号转错了怎么办 打款信息错了怎么办 报到证过期了档案怎么办 日本suica卡丢了怎么办 日本地铁卡丢了怎么办 极光卡五星老输怎么办 皮秒留下的色沉怎么办 鼻综合鼻内增生怎么办 做完鼻综合脸肿怎么办 上海车子卖了etc怎么办 车卖了etc设备怎么办 车卖了etc没摘怎么办 交通信息卡丢了怎么办 多囊卵巢无排卵怎么办 卵巢腹镜手术后一直出汗怎么办 双侧卵巢多囊怎么办 备孕子宫内膜厚怎么办 有成熟卵泡不破怎么办 卵泡不排萎缩了怎么办 卵泡8mm一直不长怎么办 卵泡已经长到28x19mm怎么办 多囊卵巢卵泡长不大怎么办 优势卵泡19不排怎么办 多囊卵泡不排卵怎么办