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

相关文章

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

SpringBoot3.X 整合 MinIO 存储原生方案

《SpringBoot3.X整合MinIO存储原生方案》本文详细介绍了SpringBoot3.X整合MinIO的原生方案,从环境搭建到核心功能实现,涵盖了文件上传、下载、删除等常用操作,并补充了... 目录SpringBoot3.X整合MinIO存储原生方案:从环境搭建到实战开发一、前言:为什么选择MinI

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

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