安卓端-入口 MainActivity
1. 项目地址
https://github.com/AutoxingTech/android_webview_demo
2. 文件地址
安卓入口文件:
file:///android_webview_demo\app\src\main\java\com\autoxing\delivery\MainActivity.java
js入口文件:
file:///android_asset/dist/index.html
3. 安卓加载webview代码及说明
示例
Example
Java |
---|
| ##### "java 初始化活动的加载配置webview"
/**
* 初始化活动的主要方法
* 此方法设置主布局,检查并请求外部存储权限,配置WebView,并初始化视图组件
* @param savedInstanceState 保存的实例状态,当活动重新创建时使用
*/
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 检查并请求外部存储权限
if (Build.VERSION.SDK_INT>=23&&checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
}
// 必须保留此行以创建外部文件目录
getExternalFilesDir("").getAbsolutePath();
// 初始化启动视图并设置点击监听器
launcherView = findViewById(R.id.launch_view);
// 设置启动器视图的点击监听器
launcherView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 当点击事件发生时,调用主活动的加载WebView方法
MainActivity.this.loadWebView();
}
});
// 配置WebView的设置
webView = findViewById(R.id.web_view);
// 启用JavaScript支持,对于现代网页的交互功能是必需的
webView.getSettings().setJavaScriptEnabled(true);
// 允许访问文件资源,以便webView可以加载本地文件协议的内容
webView.getSettings().setAllowFileAccess(true);
// 允许访问内容资源,即允许加载http/https协议的内容
webView.getSettings().setAllowContentAccess(true);
// 启用DOM存储,以便网页可以使用本地存储功能
webView.getSettings().setDomStorageEnabled(true);
// 设置WebChromeClient以增强WebView的功能
webView.setWebChromeClient(new WebChromeClient());
// 自定义WebViewClient以处理页面加载事件
webView.setWebViewClient(new WebViewClient(){
// 定义一个布尔变量用于标记页面是否加载完成
Boolean pageFinished = false;
/**
* 当页面开始加载时调用
* @param view WebView控件
* @param url 正在加载的网址
* @param favicon 网站的图标
*/
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
Log.i(TAG,"onPageStarted");
// 页面开始加载时,将加载的标记设置为false
pageFinished = false;
super.onPageStarted(view, url, favicon);
}
/**
* 当页面加载完成时调用
* @param view WebView控件
* @param url 已加载完成的网址
*/
@Override
public void onPageFinished(WebView view, String url) {
Log.i(TAG,"onPageFinished"+view.getProgress());
// 检查页面是否完全加载完成且尚未被标记为完成
if(view.getProgress()==100&&pageFinished==false){
// 启动一个新的线程
new Thread(new Runnable() {
@Override
public void run() {
try {
// 让线程睡眠1秒
Thread.sleep(1000*1);
}catch (Exception e){
e.printStackTrace();
}
// 在UI线程中运行代码,通常用于更新UI
runOnUiThread(new Runnable() {
@Override
public void run() {
// 隐藏launcherView,例如加载指示器
launcherView.setVisibility(View.GONE);
}
});
}
}).start();
// 将页面加载完成的标记设置为true
pageFinished = true;
}
super.onPageFinished(view, url);
}
});
// 注册JavaScript接口,允许JavaScript调用Android方法
webView.addJavascriptInterface(MainActivity.this, "app");
// 初始化WebView加载操作
this.loadWebView();
// 设置按钮的点击监听器,用于调用WebView中的JavaScript方法
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
webView.loadUrl("javascript:callJSHello("+Math.random()+")");
}
});
// 当Activity被创建时,记录日志
Log.i(TAG,"onCreate");
}
|
Java |
---|
| ##### "java 该方法主要负责显示WebView并加载特定的URL,用于展示SDK的功能"
/**
* 在实际应用中,可以通过加载特定的URL来体验和交互SDK提供的功能
*/
private void loadWebView() {
// 设置launcherView为可见状态,可能用于指示WebView的加载过程
launcherView.setVisibility(View.VISIBLE);
// 以下是关于如何使用WebView的说明注释
// 运行此项目 https://github.com/AutoxingTech/AX_SDK1.0_Example,
// 之后 webView.loadUrl("https://xxxxx/sdk/v1.0/example");
// 即可体验sdk功能
// file:///android_asset/dist/index.html 为android与js交互demo
// 加载本地HTML文件,用于展示SDK功能和android与js的交互示例
webView.loadUrl("file:///android_asset/dist/index.html");
}
|
Java |
---|
| ##### "java主要目的是演示如何从JavaScript代码调用Android(Java)方法进行交互"
/**
* 此方法的主要目的是演示如何从JavaScript代码调用Android(Java)方法。
* @param args JavaScript方法传递的参数,将作为输入字符串进行处理。
* @return 返回拼接了输入参数、随机数和固定字符串的结果字符串。
*/
@android.webkit.JavascriptInterface
public String actionFromJsHello(String args) {
return args+Math.random()+"android_返回结果";
}
/**
* 此方法的主要目的是在JavaScript代码中触发网页刷新操作。
* 它通过在Android主线程中执行刷新操作来实现。
*/
@android.webkit.JavascriptInterface
public void actionFromJsWebRefresh() {
Log.i(TAG,"刷新网页");
runOnUiThread(new Runnable() {
@Override
public void run() {
MainActivity.this.loadWebView();
}
});
}
|
HTML |
---|
| <!DOCTYPE html>
<html lang="en">
<head>
// 引入js-sdk
<script src=./autoxing-robot-js-sdk1.0.81.js></script>
<script>
// appId 可向相关运营人员申请提供
const appId = "—————————————"
// 密钥 可向相关运营人员申请提供
const appSecret = "——————————————————————————————"
// 定义机器人sn
const robotId = "xxxxxxxxxxx817"
// 初始化,参数包括应用ID、应用密钥和应用模式,这里设置为广域应用模式
* **AppMode** - [AppMode](../Define/Define-AppMode)
let axRobot = new AXRobot(appId, appSecret, AppMode.WAN_APP);
// 初始化
function init() {
axRobot.init().then((isOk) => { //初始化
return axRobot.connectRobot({ //连接机器人
robotId: robotId
})
}).then((isOK) => {
return axRobot.getPoiList(); //拉取站点信息
}).then((res) => {
console.log(res)
}).catch((res) => {
console.log(res.errText)
})
}
// 安卓调用JavaScript的Hello函数 @param {string} text - 从Android传入的字符串参数
function callJSHello(text) {
// 调用sdk初始化
init()
// 获取ID为"androidContent"的元素,显示从Android传入的值,前面加上提示文本
document.getElementById("androidContent").innerHTML = "Android传入值:" + text
}
// js 调用 Android 提供的方法
function clickAndroidHello() {
//app来自: webView.addJavascriptInterface(MainActivity.this, "app");
let android_res = app.actionFromJsHello("你好")
// 通过调取安卓方法返回值显示在ID为"androidContent"的元素
document.getElementById("androidContent").innerHTML = android_res
}
// js调用Android的方法刷新webView
function clickAndroidRefresh() {
//调用Android原生的app.actionFromJsWebRefresh方法,进行WebView的刷新操作.
app.actionFromJsWebRefresh()
}
</script>
</head>
<body>
<div style="margin-top:50px;font-weight:bold">111Android WebView 交互Demo</div>
<div id="androidContent">
</div>
<button onclick="clickAndroidHello()">调用Android代码</button>
<button onclick="clickAndroidRefresh()">调用Android刷新webView</button>
</body>
</html>
|