android原生与js互调

2023-10-08 12:32
文章标签 android js 原生 互调

本文主要是介绍android原生与js互调,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.初始化

1.布局中添加webview控件2.让webview支持jswebView.getSettings().setJavaScriptEnabled(true);3.加载网页webView.loadUrl(url);4.让webview加载网页id_webview.setWebChromeClient(new WebChromeClient());

2.原生调用JS方法

1.原生调用js不带返回值的方法
js带参数的方法 不带返回值
function nativeCallToJS(param) {alert(param);
}//原生调用js 不带返回值
public void nativeCallToJS1(){js方法带参数的 参数为字符串需要加单引号 javascript:方法名 (参数名)id_webview.loadUrl("javascript:nativeCallToJS("+"'hello xiaocheng'"+")");
}2.原生调用js带返回值的方法
js带返回值方法
function returnResult(){return 1 + 2;
}//原生调用js 获取返回值 returnResult: js定义的方法 ()不能少
public void nativeCallToJS2(){id_webview.evaluateJavascript("returnResult()", new ValueCallback<String>() {@Overridepublic void onReceiveValue(String value) {Toast.makeText(MainActivity.this,"我是调用js返回的数据:"+value,Toast.LENGTH_LONG).show();}});
}

3.JS调用原生方法

@JavascriptInterface注解表面这个方法是给js调用的1. 通过addJavascriptInterface将MainActiviy所对应的对象mainActivity注入到WebView中了。2. 查看js调用原生是否在主线程 因为原生只能在主线程更新ui原生方法
@JavascriptInterface
public void jsCallNativeLookThread(String msg){Log.e("js调用原生方法是不是在主线程",Thread.currentThread().getName().equals("main")+"");Toast.makeText(this,msg,Toast.LENGTH_SHORT).show();id_webview.post(new Runnable() {@Overridepublic void run() {id_webview.loadUrl("javascript:nativeCallToJS("+"'你好啊,小成哥!'"+")");}});
}js中调用的方法 mainActivity必须与上面绑定的对象一样
function jsCallNativeLookThread(param) {window.mainActivity.jsCallNativeLookThread(param);
}3. js调用原生获取原生返回值原生方法
@JavascriptInterface
public int jsCallNativeGetResult(int num, int num1) {return num + num1;
}js调用 把计算的结果显示出来
function jsCallNativeGetResult(num1,num2) {document.getElementById("font").innerText = "调用原生计算的结果:"+window.mainActivity.jsCallNativeGetResult(num1,num2);
}4. js调用原生原生跳页传值原生方法
@JavascriptInterface
public void jsCallNativeToActivity(String msg){Intent intent = new Intent(this,SecondActivity.class);intent.putExtra("msg",msg);startActivity(intent);
}js调用
function jsCallNativeToActivity(param){window.mainActivity.jsCallNativeToActivity(param);
}5. js调用原生保存网络图片到sd卡原生方法  Android6.0以上需要动态权限处理 同时需要在清单文件中添加sd卡读写权限和网络权限
private String imagUrl;
//Js调用原生方法保持图片到sd卡
@JavascriptInterface
public void jsCallNativeSaveImg(String imgUrl){this.imagUrl = imgUrl;boolean checkResult = PermissionsCheckUtils.checkPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE);if(!checkResult){Log.e("saveImgToSdcard","权限未通过");
requestPermissions(this,STORAGECODE,Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE);}else {saveImage(imgUrl);}
}//安卓6.0以上需要动态获取权限
private  void requestPermissions(Activity activity, int requestCode,String... permissions){ActivityCompat.requestPermissions(activity,permissions,requestCode);
}//权限处理请求返回值
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {//判断请求码,确定当前申请的权限if (requestCode == STORAGECODE) {//判断权限是否申请通过if (grantResults.length == 2 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {//授权成功saveImage(imagUrl);} else {//授权失败}} else {super.onRequestPermissionsResult(requestCode, permissions, grantResults);}
}//保存图片方法
private void saveImage(String imgUrl) {Log.e("saveImg","图片地址:"+imgUrl);InputStream is = null;FileOutputStream fos = null;try {URL url = new URL(imgUrl);if(url != null){is = url.openStream();}if(is != null){Bitmap bitmap = BitmapFactory.decodeStream(is);if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)&& !Environment.isExternalStorageRemovable()){File targetFile = new File(Environment.getExternalStorageDirectory(),"testImgs");if(!targetFile.exists()){targetFile.mkdir();}File file = new File(targetFile.getAbsolutePath(), UUID.randomUUID().toString()+".jpg");fos = new FileOutputStream(file);//80代表压缩率为20%bitmap.compress(Bitmap.CompressFormat.JPEG,80,fos);fos.flush();fos.close();}}} catch (Exception e) {e.printStackTrace();}finally {if(is != null){try {is.close();} catch (IOException e) {e.printStackTrace();}}}
}js调用原生方法保存图片
function jsCallNativeSaveImg() {var imgUrl = "https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=3668554427,3084213941&fm=200&gp=0.jpg";window.mainActivity.jsCallNativeSaveImg(imgUrl);
}6. html页面中点击事件处理<html lang="en">
<head><meta charset="UTF-8"><title>Main</title><link rel="stylesheet" href="./main.css" type="text/css" /><script src="./main.js"></script>
</head>
<body><div class="layout"><h3 id="font" style="padding-top:10px">zlc</h3><button class="button" onclick="jsCallNativeLookThread('测试线程 ')">js调用Native查看线程</button><br/><button class="button" onclick="jsCallNativeGetResult(518,2)">js调用Native获取返回值</button><br/><button class="button" onclick="jsCallNativeToActivity('100')">js调用Native跳页传值</button><br/><button class="button" onclick="jsCallNativeSaveImg()">js调用native保存图片</button></div>
</body>
</html>

4.总结

其实android原生与js互调比想象中简单

5.下载地址

点击去下载

6.联系方式

qq:1509815887

这篇关于android原生与js互调的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/165303

相关文章

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

使用Python获取JS加载的数据的多种实现方法

《使用Python获取JS加载的数据的多种实现方法》在当今的互联网时代,网页数据的动态加载已经成为一种常见的技术手段,许多现代网站通过JavaScript(JS)动态加载内容,这使得传统的静态网页爬取... 目录引言一、动态 网页与js加载数据的原理二、python爬取JS加载数据的方法(一)分析网络请求1

go rate 原生标准限速库的使用

《gorate原生标准限速库的使用》本文主要介绍了Go标准库golang.org/x/time/rate实现限流,采用令牌桶算法控制请求速率,提供Allow/Reserve/Wait方法,具有一定... 目录介绍安装API介绍rate.NewLimiter:创建限流器limiter.Allow():请求是否

Android NDK版本迭代与FFmpeg交叉编译完全指南

《AndroidNDK版本迭代与FFmpeg交叉编译完全指南》在Android开发中,使用NDK进行原生代码开发是一项常见需求,特别是当我们需要集成FFmpeg这样的多媒体处理库时,本文将深入分析A... 目录一、android NDK版本迭代分界线二、FFmpeg交叉编译关键注意事项三、完整编译脚本示例四

VSCode中配置node.js的实现示例

《VSCode中配置node.js的实现示例》本文主要介绍了VSCode中配置node.js的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一.node.js下载安装教程二.配置npm三.配置环境变量四.VSCode配置五.心得一.no

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

Android 实现一个隐私弹窗功能

《Android实现一个隐私弹窗功能》:本文主要介绍Android实现一个隐私弹窗功能,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 效果图如下:1. 设置同意、退出、点击用户协议、点击隐私协议的函数参数2. 《用户协议》、《隐私政策》设置成可点击的,且颜色要区分出来res/l

Android实现一键录屏功能(附源码)

《Android实现一键录屏功能(附源码)》在Android5.0及以上版本,系统提供了MediaProjectionAPI,允许应用在用户授权下录制屏幕内容并输出到视频文件,所以本文将基于此实现一个... 目录一、项目介绍二、相关技术与原理三、系统权限与用户授权四、项目架构与流程五、环境配置与依赖六、完整