以下Alert()。Confirm()。Prompt()方法都可以进行JS-APP通信: 本次使用Prompt 方式传参,具体往下看
function call(){
var value = document.getElementById("input").value;
alert(value);
}
//警告
function onAlert(){
alert("This is a Alert");
}
//确定
function onConfirm(){
var b = confirm("Understand?");
}
//提示
function onPrompt(){
var b = prompt("Tip","Default");
}
点我弹出Alert
1.添加点击事件:
参数1:与APP通信约定:"js://将要调用的APP内部方法名"(如:"js://OpenNewDetails",OpenNewDetails就是APP内部方法了)
参数2:提示对话框中显示的默认值,改为提供给APP默认数据使用,如:加密后的uid
2.编写JS:
//方法演示A:
function onPrompt(参数1,参数2){
var result = prompt("参数1", "参数2");
}
//方法B例:调用APP方法,【不添加额外参数】,如("js://OpenNewDetails","+BdFzRomKfE=")
var result = prompt("js://OpenNewDetails","+BdFzRomKfE=");
//方法C例:调用APP方法,【添加额外参数】,如("js://OpenNewDetails?aid=66&title=XXX","+BdFzRomKfE=")
var result = prompt("js://OpenNewDetails?aid=66&title=北斗导航系统的重要性","+BdFzRomKfE=");
附:
Android 调用 JS: loadUrl("javascript:onJsMethod("str",12)");
Html加载进度:
android:id="@+id/myProgressBar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="2dp"
android:progressDrawable="@drawable/progress_horizontal" />
添加progress_horizontal.xml
android:id="@android:id/background"
android:drawable="@drawable/bg_default_white" />
android:endColor="#6efb89"
android:startColor="#6efb89" />
设置进度,设置HTML视频背景,设置交互
extends WebChromeClient {
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
// Activity的进度范大于或等于100表示页面加载完成
if (newProgress == 100) {
if (mProgressBar != null) {
mProgressBar.setVisibility(View.GONE);
}
} else {
if (mProgressBar != null) {
if (View.GONE == mProgressBar.getVisibility()) {
mProgressBar.setVisibility(View.VISIBLE);
}
mProgressBar.setProgress(newProgress);
}
}
}
@Nullable
@Override
public Bitmap getDefaultVideoPoster() {
try {
//加载H5视频,解决出现灰色背景和大黑色播放按钮背景问题
return Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
} catch (Exception e) {
return super.getDefaultVideoPoster();
}
}
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
try {
ActivityUtils.analysisJs(mContext, message);
result.cancel();//点击了取消按钮
return true;
} catch (Exception e) {
LogUtil.iYx("解析H5Message失败" + e.getMessage());
}
//放行Prompt();
return super.onJsPrompt(view, url, message, defaultValue, result);
}
}
添加解析方法:analysisJs()
/**
* 解析H5中的约定
* js://->约定
* OpenNewDetails->方法
* aid=10&device=huawei->问号后面传参
* uid->默认参数
* @param str prompt(js://OpenNewDetails?aid=10&device=huawei,uid)
*/
public static void analysisJs(Context mContext, String str) {
//1.判断是否是JS
int index = str.indexOf(":");
String protocol = str.substring(0, index);
if ("js".equals(protocol)) {
LogUtil.iYx("-----Js_Prompt:拦截-----");
//2. 获取Url中的方法名
String methodStr = "";
int indexEnd = str.indexOf("?");
LogUtil.iYx("-----?号下标-------" + indexEnd);
if (indexEnd < 0) {
//在Url中没有?号表示没有参数
methodStr = str.substring(5);//直接从5号下标截取到末尾
} else {
methodStr = str.substring(5, indexEnd);//截取到方法名
}
//3.判断调用哪个方法
if (methodStr.contains("OpenNewDetails")) {
//4.获取方法中的参数
if (indexEnd > 0) {
//有参数,获取到拼接的完整参数:aid=10&device=huawei
String dataStr = str.substring(indexEnd + 1);
String[] dataAry = dataStr.split("&");
//参数集合
HashMap dataMap = new HashMap<>(dataAry.length);
for (String d : dataAry) {
String[] mAry = d.split("=");
dataMap.put(mAry[0], mAry[1]);
}
//5.打开新的H5
if (dataMap.size() > 0) {
String aid = dataMap.get("aid");
if (!TextUtils.isEmpty(aid)) {
toWebViewActivity(mContext, aid, "科普详情");
}
}
}
}
}
}
一键复制
编辑
Web IDE
原始数据
按行查看
历史