GVKun编程网logo

在WebView中如何让JS与Java安全地互相调用(webview与js交互)

17

对于在WebView中如何让JS与Java安全地互相调用感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍webview与js交互,并为您提供关于AndroidNaive与WebView的互相调用

对于在WebView中如何让JS与Java安全地互相调用感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍webview与js交互,并为您提供关于Android Naive与WebView的互相调用详解、android webview js交互, 响应webview中的图片点击事件、Android Webview中如何通过Javascript对本地数据库操作、Android webview和js互相调用实现方法的有用信息。

本文目录一览:

在WebView中如何让JS与Java安全地互相调用(webview与js交互)

在WebView中如何让JS与Java安全地互相调用(webview与js交互)

rt:

http://www.apkbus.com/portal.php?mod=view&aid=11760

Android Naive与WebView的互相调用详解

Android Naive与WebView的互相调用详解

Android  Naive与WebView的互相调用详解

Android的Naive程序是可以嵌套WebView,并且可以做到与WebView的交互,一般来说有两种方法,一是直接交互,比如,Naive直接调用WebView的方法和WebView直接调用Naive的方法。二是WebView可以写<a/>超链接标签,然后用户点击此标签时,Naive可以拦截到点击标签的事件,这样,我们可以在链接上做一套自己的协议,然后Android和iOS可以根据此协议做出相同的处理,做到多平台统一。

我们先研究一下Naive和WebView如何相互调用。

    初始化:

mWebView = (WebView) findViewById(R.id.main_wv); 
mWebView.getSettings().setJavaScriptEnabled(true); 
mWebView.loadUrl("file:///android_asset/demo.html"); 
//第一个为交给WebView来进行控制的对象,第二个为控制的对象的变量名,即JS得到此对象后,在为此对象赋名,就可以进行控制了。 
mWebView.addJavascriptInterface(this,"naive"); 

  1、Naive直接调用JS方法:

  下面为html中的JS方法  :

function alert(){ 
document.getElementById("title").innerHTML = "Naive调用Js无参方法"; 
} 

   naive进行调用,方式为调用WebView的loadUrl方法,方法中传递一个String,格式为'javascript:'+'方法名'+'(变量)'

public void onjs(View view) { 
    mWebView.loadUrl("javascript:alert()"); 
} 

    有参数JS方法:

function alertWith(arg){ 
document.getElementById("title").innerHTML = arg; 
} 

    naive进行有参JS调用:

public void onjsWith(View view) { 
    mWebView.loadUrl("javascript:alertWith('Naive调用Js有参方法')"); 
} 

    2、JS调用naive:

      本地先写好要被调用的方法,注意前面需要加上注解@JavascriptInterface

@JavascriptInterface 
public void toast() { 
Toast.makeText(this,"JS调用了Naive的无参方法",Toast.LENGTH_SHORT).show(); 
} 

      JS调用的代码:

<input type="button" value="点击调用naive代码" onclick="window.naive.toast()"/>

     本地写好有参的要被调用的方法:

@JavascriptInterface 
public void toastWith(String toast) { 
Toast.makeText(this,toast,Toast.LENGTH_SHORT).show(); 
} 

        js调用有参的代码:

<input type="button" value="点击调用naive代码并传递参数" 
    onclick="window.naive.toastWith('JS调用了Naive的有参代码')"/> 

下面将Activity的源代码贴出来; 

public class MainActivity extends AppCompatActivity { 
 
  private WebView mWebView; 
 
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
 
    mWebView = (WebView) findViewById(R.id.main_wv); 
    mWebView.getSettings().setJavaScriptEnabled(true); 
    mWebView.addJavascriptInterface(this,"naive"); 
    mWebView.loadUrl("file:///android_asset/demo.html"); 
 
  } 
 
 
  public void onjs(View view) { 
    mWebView.loadUrl("javascript:alert()"); 
  } 
 
  public void onjsWith(View view) { 
    mWebView.loadUrl("javascript:alertWith('Naive调用Js有参方法')"); 
  } 
 
 
  @JavascriptInterface 
  public void toast() { 
    Toast.makeText(this,Toast.LENGTH_SHORT).show(); 
  } 
 
  @JavascriptInterface 
  public void toastWith(String toast) { 
    Toast.makeText(this,Toast.LENGTH_SHORT).show(); 
  } 
 
} 

下面为HTML的代码:

<html> 
<head> 
  <Meta http-equiv="Content-Type" content="text/html;charset=gb2312"> 
  <script type="text/javascript"> 
    function alert(){ 
       document.getElementById("title").innerHTML = "Naive调用Js无参方法"; 
    } 
    function alertWith(arg){ 
       document.getElementById("title").innerHTML = arg; 
    } 
 
  </script> 
</head> 
<body> 
<h1 id="title"></h1><br/> 
<input type="button" value="点击调用naive代码" onclick="window.naive.toast()"/><br/> 
<input type="button" value="点击调用naive代码并传递参数" 
    onclick="window.naive.toastWith('JS调用了Naive的有参代码')"/> 
</body> 
</html> 

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

android webview js交互, 响应webview中的图片点击事件

android webview js交互, 响应webview中的图片点击事件

    转载请注明出处
        挺帅的移动开发专栏   http://blog.csdn.net/wangtingshuai/article/details/8635787
     最近碰到个新需求需要点击webview中的图片进行放大显示。
整理了下思路,想到了下面的一个可行的方案。

方案思路,
1.在点击图片的时候调用本地的java方法并给出响应的图片地址
2.本地获得图片地址后,开启一个遮罩activity进行显示和处理

第二步的实现很容易实现,关键是第一步的实现,在网页中点击图片不会调用本地的java代码。那么我们需要给这个点击事件加上相应的js函数,让点击事件调用的js函数来调用我们提前准备好的java函数,等我们捕获到图片的url剩下的就好处理了。
关键点就是给普通的html注入我们的js函数,让图片能够响应点击并调用js函数,在通过js函数来调用我们的java函数。听起来好像有点绕,不过也不难,下面我们用代码实现下

对java和js交互还不熟悉的同学,请参照前面的文章
http://blog.csdn.net/wangtingshuai/article/details/8631835

这次实例的主要功能:点击图片在新的activity中展示,对图片能够进行手势操作,包括双指缩放等
效果图

加载webview的activity代码  

package wst.webview;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;

@SuppressLint("SetJavaScriptEnabled")
public class MainActivity extends Activity {

	private WebView contentWebView = null;

	@SuppressLint("SetJavaScriptEnabled")
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		contentWebView = (WebView) findViewById(R.id.webview);
		// 启用javascript
		contentWebView.getSettings().setJavaScriptEnabled(true);
		// 随便找了个带图片的网站
		contentWebView.loadUrl("http://www.weim.me/12408.html");
		// 添加js交互接口类,并起别名 imagelistner
		contentWebView.addJavascriptInterface(new JavascriptInterface(this), "imagelistner");
		contentWebView.setWebViewClient(new MyWebViewClient());

	}

	// 注入js函数监听
	private void addImageClickListner() {
		// 这段js函数的功能就是,遍历所有的img几点,并添加onclick函数,函数的功能是在图片点击的时候调用本地java接口并传递url过去
		contentWebView.loadUrl("javascript:(function(){" +
		"var objs = document.getElementsByTagName(\"img\"); " + 
				"for(var i=0;i<objs.length;i++)  " + 
		"{"
				+ "    objs[i].onclick=function()  " + 
		"    {  " 
				+ "        window.imagelistner.openImage(this.src);  " + 
		"    }  " + 
		"}" + 
		"})()");
	}

	// js通信接口
	public class JavascriptInterface {

		private Context context;

		public JavascriptInterface(Context context) {
			this.context = context;
		}

		public void openImage(String img) {
			System.out.println(img);
			//
			Intent intent = new Intent();
			intent.putExtra("image", img);
			intent.setClass(context, ShowWebImageActivity.class);
			context.startActivity(intent);
			System.out.println(img);
		}
	}

	// 监听
	private class MyWebViewClient extends WebViewClient {
		@Override
		public boolean shouldOverrideUrlLoading(WebView view, String url) {

			return super.shouldOverrideUrlLoading(view, url);
		}

		@Override
		public void onPageFinished(WebView view, String url) {

			view.getSettings().setJavaScriptEnabled(true);

			super.onPageFinished(view, url);
			// html加载完成之后,添加监听图片的点击js函数
			addImageClickListner();

		}

		@Override
		public void onPageStarted(WebView view, String url, Bitmap favicon) {
			view.getSettings().setJavaScriptEnabled(true);

			super.onPageStarted(view, url, favicon);
		}

		@Override
		public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {

			super.onReceivedError(view, errorCode, description, failingUrl);

		}
	}

}

展示图片的activity代码

package wst.webview;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

import android.app.Activity;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.widget.TextView;

public class ShowWebImageActivity extends Activity {
	private TextView imageTextView = null;
	private String imagePath = null;
	private ZoomableImageView imageView = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.show_webimage);
		this.imagePath = getIntent().getStringExtra("image");

		this.imageTextView = (TextView) findViewById(R.id.show_webimage_imagepath_textview);
		imageTextView.setText(this.imagePath);
		imageView = (ZoomableImageView) findViewById(R.id.show_webimage_imageview);

		try {
			imageView.setImageBitmap(((BitmapDrawable) ShowWebImageActivity.loadImageFromUrl(this.imagePath)).getBitmap());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static Drawable loadImageFromUrl(String url) throws IOException {

		URL m = new URL(url);
		InputStream i = (InputStream) m.getContent();
		Drawable d = Drawable.createFromStream(i, "src");
		return d;
	}
}


图片布局文件 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <!-- TODO 默认占位图 -->

    <wst.webview.ZoomableImageView
        android:id="@+id/show_webimage_imageview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:scaleType="matrix"
        android:src="@drawable/icon" />

    <TextView
        android:id="@+id/show_webimage_imagepath_textview"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:textColor="#ffff0000" />

</LinearLayout>

希望对大家有所帮助
源代码附上
http://download.csdn.net/detail/wangtingshuai/5109179


Android Webview中如何通过Javascript对本地数据库操作

Android Webview中如何通过Javascript对本地数据库操作

问问在开发Android Web APP时,如何通过Javascript在Webview中实现对本地数据库的操作?


Android webview和js互相调用实现方法

Android webview和js互相调用实现方法

Android-webview和js互相调用

Android 和 H5 都是移动开发应用的非常广泛。市面上很多App都是使用Android开发的,但使用Android来开发一些比较复杂附属类,提示性的页面是得不偿失的。而H5具有开发速度快,更新不用依赖于App的更新,只需要服务端更新相应的页面即可,所以,App和H5页面相结合就显得尤为重要。而android和H5都不可能每次都是独立存在的,而是相互影响也相互的调用,获取信息等,例如,H5页面要获取App中的用户的基本信息,或者App端要操作H5页面等,下面来看看这两是怎么交互的。

先来看一下项目的整体架构(Android studio中的项目)

整个项目的结构就是这样的,里面最主要的就是assets下面的js_webView.html文件和代码中的WebViewJsActivity,其中项目里面的MainActivity只是做了个跳转而已,跳转到WebViewJsActivity。就这样。

下面上代码:(js_webView.html)

html里面的代码也比较简单,整个html中就一个Button,点击这个Button的时候去执行javascript中的 jsCallAndroid() 方法。

网页中有关 javascript 的代码也比较简单,整个 js 就2个方法,一个是 jsCallAndroid() ,一个是 androidCallJs() 。看方法名就知道了,分别是 js 调用 Android 的和 Android 调用 js 的。

先不要去管 jsCallAndroid() 里面做的是什么,待会会解释,来看看 androidCallJs() 这个方法里面做的就是弹出一个信息提示框,具体提示什么信息都不重要了,随便。

再来看看代码部分(WebViewActivity的布局文件): 

整个布局文件也很简单,一个按钮和一个WebView,按钮是用来测试 Android 调用 js 用的,js 调用 Android 就当然是 webview 加载的网页里面的按钮了。

再来看看 Java 代码部分(WebViewActivity):

下面来看看代码部分:

37-42行:这几行就是android中的按钮的点击事件,没什么好解释的,来看看点击事件做的是什么?点击事件做的是:调用 webview 的 loadurl 方法去调用 js 中的方法;调用的方式是:前面是 javascript 中间用 : 分隔 最后是 要调用的 js 的方法名。

45-55行:这几行就是有关于 Webview 的设置等,46-51 这几行是指支持弹窗,也就是支持 html 网页弹框,因为前面的 html 代码中,有我们 Android 调用 js 的时候,调用成功就 js 弹窗,所以这里要加上这个设置。接下来是53行,53行指的是支持 javascript 这里指的是支持 html 中的 javascript 解析,不管是不是 js 和 Android 交互,只要网页中含有 js ,都要。最关键的就是54行,54行就是 javascript 和 Android 交互的了,addJavascriptInterface 方法需要接受两个参数,第一个是与之相对应的 js 调用 Android 本地的类的对象,这个例子中的就是58-63行这个类的对象,第二个参数就是和前面网页中的js代码中的 jsCallAndroid 方法中的 wv.sayHello(),这里的 wv 就和这个参数(wv)与之相对应,而 sayHello() 就是对应的第一个参数的对象里面的方法。

最后是58-63行,这几行没什么好解释的了,只是如果调用成功就打印一行日志。仅此检验是否调用成功而已。

整个 demo 代码到此完毕,好激动,赶紧运行试试看。

运行的结果会让很多人失望,只是android调用js成功了,但 js 调用 android 不成功。 

这是为什么呢?这里要涉及到的是有关于 webview 和 js 的安全性的问题。js 可以通过这种方式下载恶意代码在 android 上执行,具体有兴趣的可以去 Google 一下,所以上面这种写法只是对于 Api16以前的android手机是适用的,16以后,谷歌对这个安全性问题进行了修复。将其注解到android自带的一个javascriptInterfface类中。下面就来看看16以后的写法是咋样的?

 有了注解,简直如虎添翼,非常方便。还是原来的配方,还是原来的味道,原汁原味。除了 Activity 中的代码需要修改,其他都不动。

改动的代码有55行,直接传一个 this(Context) 对象就可以了,那么,原来的 JsInterface 就可以不要了。不要那我 sayHello 方法写到哪里呢?既然你传递的是 this ,当然是写到 this 里面咯(59-62行)。不同的是,这个 sayHello() 方法必须加上一个 JavascriptInterface 的注解。

OK了,16以前和16以后的都有了,不就OK了么。在添加javascript的时候判断一下 Api 版本就可以了,哈哈。。。

不不不,肯定不是这样子做。指需要在onCreate() 方法上添加 @SuppressLint("JavascriptInterface") 注解即可。

看下面的就是终极代码了。

 

对,没错,就是这样子。大功告成。

最后需要提一点的是,上面的例子是可以执行,正常情况下都没什么问题,但你看看网上的demo,很多在 android 调用 js 的时候是开一个子线程去调用,没错,实际开发中,是必须要这样子做的。好处就不言而喻了。这一点看最后一张代码图,这里也有给出,直接调用webview的post,里面就是 Android 调用 js 了。

 

今天的关于在WebView中如何让JS与Java安全地互相调用webview与js交互的分享已经结束,谢谢您的关注,如果想了解更多关于Android Naive与WebView的互相调用详解、android webview js交互, 响应webview中的图片点击事件、Android Webview中如何通过Javascript对本地数据库操作、Android webview和js互相调用实现方法的相关知识,请在本站进行查询。

本文标签: