Android与H5互调

前言

微信,微博,微商,QQ空间,大量的软件使用内嵌了H5,这个时候就需要了解Android如何更H5交互的了;有些外包公司,为了节约成本,采用Android内嵌H5模式开发,便于在IOS上直接复用页面,最终解决成本。

为什么学android也要学h5?

Android很多软件都有内嵌H5的,有什么用处、优势?节约成本,提高开发效率。

实现的原理是什么?

本质是:Java代码和JavaScript调用

案例一:Java与Js简单互调

首先,在Android代码中加载H5页面:

private void initWebView() {
        webView = new WebView(this);
        WebSettings webSettings = webView.getSettings();
        //设置支持javaScript脚步语言
        webSettings.setJavaScriptEnabled(true);

        //支持双击-前提是页面要支持才显示
        webSettings.setUseWideViewPort(true);

        //支持缩放按钮-前提是页面要支持才显示
        webSettings.setBuiltInZoomControls(true);

        //设置客户端-不跳转到默认浏览器中
        webView.setWebViewClient(new WebViewClient());

        //加载网络资源
        //webView.loadUrl("http://atguigu.com/teacher.shtml");
        webView.loadUrl("file:///android_asset/JavaAndJavaScriptCall.html");

        //显示页面
        setContentView(webView);
    }

JavaAndJavaScriptCall.html:

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <script type="text/javascript">

    function javaCallJs(){
         document.getElementById("content").innerHTML +=
             "<br\>java调用了js无参函数";
    }

    function javaCallJs(arg){
         document.getElementById("content").innerHTML =
             ("欢迎:"+arg );
    }

   function showDialog(){
      alert("谷粉们你好,我是来自javascript");
   }
    </script>
</head>
<body>
<div align="left" id="content"> 谷粉</div>

<input type="button" value="点击Android被调用" onclick="window.Android.showToast()" />
</body>
</html>

Java调用javaScript:

/**
 * Java调用javaScript
 * @param numebr
 */
private void login(String numebr) {
    webView.loadUrl("javascript:javaCallJs("+"‘"+numebr+"‘"+")");
    setContentView(webView);
}

JavaScript调用Java

    /**
     * js可以调用该类的方法
     */
    class AndroidAndJSInterface{
        @JavascriptInterface
        public void showToast(){
            Toast.makeText(JavaAndJSActivity.this, "我被js调用了", Toast.LENGTH_SHORT).show();
        }
    }
   //与此同时需要在webview当中注册,后面的“Android”与html中的对应:
   webView.addJavascriptInterface(new AndroidAndJSInterface(),"Android");
   //html里的点击事件实现:<br>
   <input type="button" value="点击Android被调用" onclick="window.Android.showToast()" />

案例二:H5页面调用Android播放视频

了解了简单调用,下面讲的这个也就简单了:

1_JsCallJavaVideoActivity的布局和实例化控件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.atguigu.androidandh5.JsCallJavaVideoActivity">

    <WebView
        android:id="@+id/webview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout>

2_实例化控件并且配置

public class JsCallJavaVideoActivity extends Activity {

    private WebView webView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_js_call_java_video);
        webView = (WebView) findViewById(R.id.webview);
        WebSettings webSettings = webView.getSettings();
        //设置支持javaScript脚步语言
        webSettings.setJavaScriptEnabled(true);

        //支持双击-前提是页面要支持才显示
//        webSettings.setUseWideViewPort(true);

        //支持缩放按钮-前提是页面要支持才显示
        webSettings.setBuiltInZoomControls(true);

        //设置客户端-不跳转到默认浏览器中
        webView.setWebViewClient(new WebViewClient());

        //加载网络资源
//        webView.loadUrl("http://atguigu.com/teacher.shtml");
         webView.loadUrl("file:///android_asset/RealNetJSCallJavaActivity.htm");

    }

 }

3_加载页面

//加载本地资源        webView.loadUrl("file:///android_asset/RealNetJSCallJavaActivity.htm");

4_参照js代码写Java被调用代码

url = "/mobiles/interActive/65411";
var videourl = "http://10.0.2.2:8080/yellow.mp4";
var itemid = "65411";
var itemdesc = "1级单杀小龙,5级单杀峡谷先锋!";
var itempic = "http://avatar.anzogame.com/pic_v1/lol/news/20160507/spic65411h572d6eaf.jpg";
var itemtitle = "6.9玛尔扎哈OP套路教程";
var obj_play = document.getElementById(‘play‘);
var obj_download = document.getElementById(‘download‘);
if(obj_play != null) {
    obj_play.ontouchstart = function() {
        this.className = ‘inter_click‘;
        javascript:android.playVideo(itemid, videourl, itemtitle);
        ajaxrequest(‘/stat/item‘, "POST", true, {type:‘play‘, id:itemid});
    }
    obj_play.ontouchend = function() {
        this.className = ‘inter‘;
    }
}

5_配置Javascript接口

//设置支持js调用java
webView.addJavascriptInterface(new AndroidAndJSInterface(),"android");

6_Javascript接口类

class AndroidAndJSInterface {
    /**
     * 该方法将被js调用
     * @param id
     * @param videoUrl
     * @param tile
     */
    @JavascriptInterface
    public void playVideo(int id,String videoUrl,String tile){
        //调起系统所有播放器
        Intent intent = new Intent();
        intent.setDataAndType(Uri.parse(videoUrl),"video/*");
        startActivity(intent);
    }
}

案例三:H5页面调用Android拨打电话

1_JsCallJavaCallPhoneActivity布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.atguigu.androidandh5.JsCallJavaVideoActivity">

    <WebView
        android:id="@+id/webview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout>

2_初始化WebView并且配置

private WebView webView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_js_call_java_video);
        webView = (WebView) findViewById(R.id.webview);
        WebSettings webSettings = webView.getSettings();
        //设置支持javaScript脚步语言
        webSettings.setJavaScriptEnabled(true);

        //支持双击-前提是页面要支持才显示
//        webSettings.setUseWideViewPort(true);

        //支持缩放按钮-前提是页面要支持才显示
        webSettings.setBuiltInZoomControls(true);

        //设置客户端-不跳转到默认浏览器中
        webView.setWebViewClient(new WebViewClient());

        //设置支持js调用java
        webView.addJavascriptInterface(new AndroidAndJSInterface(), "Android");

        //加载本地资源
//        webView.loadUrl("http://atguigu.com/teacher.shtml");
        webView.loadUrl("file:///android_asset/JsCallJavaCallPhone.html");

    }

3_加载JsCallJavaCallPhone.html页面

//加载本地资源
//    webView.loadUrl("http://atguigu.com/teacher.shtml");
     webView.loadUrl("file:///android_asset/JsCallJavaCallPhone.html");

4_从java代码传递json数据给javascript

class AndroidAndJSInterface {
    /**
     * 该方法将被js调用,用于加载数据
     */
    @JavascriptInterface
    public void showcontacts() {
        // 下面的代码建议在子线程中调用
        String json = "[{\"name\":\"阿福\", \"phone\":\"18600012345\"}]";
        // 调用JS中的方法
        webView.loadUrl("javascript:show(‘" + json + "‘)");
    }

 }

5_拨打电话代码

class AndroidAndJSInterface {
        /**
         * 该方法将被js调用,用于加载数据
         */
        @JavascriptInterface
        public void showcontacts() {
            // 下面的代码建议在子线程中调用
            String json = "[{\"name\":\"阿福\", \"phone\":\"18600012345\"}]";
            // 调用JS中的方法
            webView.loadUrl("javascript:show(‘" + json + "‘)");
        }
        /**
         * 拨打电话
         * @param phone
         */
        public void call(String phone) {
            Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phone));
//           startActivity(intent);
        }
    }

6_h5页面:

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Insert title here</title>
        <script type="text/javascript">
            function show(jsondata){
                    var jsonobjs = eval(jsondata);
                    var table = document.getElementById("personTable");
                    for(var y=0; y<jsonobjs.length; y++){
                        var tr = table.insertRow(table.rows.length);
                        var td1 = tr.insertCell(0);
                        var td2 = tr.insertCell(1);
                        td2.align = "center";
                        td1.innerHTML = jsonobjs[y].name;
                        td2.innerHTML = "<a href=‘javascript:Android.call(\""+ jsonobjs[y].phone+ "\")‘>"+ jsonobjs[y].phone+ "</a>";
                    }
            }

        </script>
    </head>
    <body onload="javascript:Android.showcontacts()">

    <table border="0" width="100%" id="personTable" cellspacing="0">
            <tr>
                <td width="30%">姓名</td>
                <td align="center">电话</td>
            </tr>
        </table>

    </body>
</html>
时间: 2024-10-24 03:34:33

Android与H5互调的相关文章

android 和h5互调步骤

1. Android 中调用JS 假如:H5页面中有一段如下JS代码 function h5Test(str){ xxxx... xxxx... } Android中调用方式如下: 步骤一: 启动支持JS WebSettings ws = getSettings(); ws.setJavaScriptEnable(True); 步骤二: 加载网页 webView.loadUrl(url); 步骤三:调用网页中的js, 注意此处函数名要和 上面js代码中函数名完全一致 webView.loadUr

Android与H5互调(通过实例来了解Hybrid App)

前些日子,Android原生开发将被取缔的吵得火热,JavaScript是能做一个完全的APP,但只使用JavaScript做出来的APP也不会牛逼到哪里去.最好的是混合(Hybrid)开发,在需要的时候使用JavaScript,各有好处. Hybrid App中原生页面 VS H5页面:http://www.jianshu.com/p/00ff5664e000 原生页面和H5页面的优劣势分析: 原生页面 优势: (1)运行速度比较快 (2)能使用设备的底层功能,如摄像头.方向传感器.重力传感器

原生Android结合H5混合开发小结

混合开发概述 微信,微博以及现在市面上大量的软件使用内嵌了H5页面:有些外包公司,为了节约成本,采用Android内嵌H5模式开发,便于在IOS上直接复用页面, 从而提高开发效率. 实现的原理: 本质是:Java代码和Javascript调用 H5页面,只是Html的扩展,Javascript用来处理页面的逻辑 Android和H5互调案例: 一.java调用js WebView的基本设置: private void initWebView() { webView = new WebView(t

Lua学习 2) —— Android与Lua互调

2014-07-09 一.Android类调用lua并回调 Android调用Lua函数,同时把类作为参数传递过去,然后再Lua中回调类的函数 调用lua mLuaState = LuaStateFactory.newLuaState(); mLuaState.openLibs(); mLuaState.LdoString(KKLua.loadAssetsString(mContext, "lua/swallow.lua"));//将lua转换为字符串 mLuaState.getFie

Android与H5混合开发

Android 和 H5 在移动开发应用中非常广泛.市面上很多App都是使用Android开发的,但使用Android来开发一些比较复杂附属类,提示性的页面是得不偿失的.而H5在制作炫酷动画网页方面比较给力,且具有开发速度快,更新不用依赖于App的更新,只需要服务端更新相应的页面即可,所以App和H5页面相结合就显得尤为重要.而android和H5都不可能独立存在,而是相互影响的.例如,H5页面要获取App中的用户的基本信息,App端要操作H5页面等. 本文主要功能要点 1.webView如何加

Android与H5交互(java与js的交互)

1.Android  java代码 //java代码 package com.wytiger.jsdemo; import android.app.Activity;import android.os.Bundle;import android.content.Context;import android.graphics.Color;import android.view.View;import android.webkit.JavascriptInterface;import android

android cordova h5总结

最近项目 替换页面  把80%页面替换成h5了. 首页h5页面可以放在android本地.增加访问速度.节省用户流量 把服务器上的  js代码 压缩成zip格式  放在asset目录.当应用安装时候   把zip解压缩到file 目录. h5代码可以做增量更新.  登录时候  判断服务器 h5版本号是否增加.增加了  就把js代码down下来   zip解压缩到file目录.这升级时候 可以做成静默 升级 我分析过12306的代码.. 就是  这样做的

Android和H5交互-基础篇

hybrid App开发也不是什么新鲜事了,其中native和h5之间的交互则是必不可少的.Android中是如何和H5交互的? 1.webView加载页面 我们都知道在Android中是通过webView来加载html页面的,根据HTML文件所在的位置不同写法也不同: //例如:加载assets文件夹下的test.html页面 mWebView.loadUrl("file:///android_asset/test.html") //例如:加载网页 mWebView.loadUrl(

iOS/Android 浏览器(h5)及微信中唤起本地APP

在移动互联网,链接是比较重要的传播媒质,但很多时候我们又希望用户能够回到APP中,这就要求APP可以通过浏览器或在微信中被方便地唤起. 这是一个既直观又很好的用户体验,但在实现过程中会遇到各种问题: 如何解决未安装APP时的做好引导页 如何在微信中唤醒APP 在iOS9中如何处理universal link被用户误关的情况 如何解决Android各种机型.各种第三方浏览器导致的兼容问题等 在APP未安装情况下,引导用户下载后打开APP后,如何进入之前唤起时指定的页面或内容,即如何实现场景还原 在