【笔记】Trae+Andrioid Studio+Kotlin开发安卓WebView应用

【笔记】Trae+Andrioid Studio+Kotlin开发安卓WebView应用

文章目录

简介

使用Trae配合Andriod Studio开发一个内嵌WebView的安卓应用, 在WebView中加载本地资源, 在APP中捕获按键事件对WebView中的内容进行操作;

依赖

  • Trae CN (https://www.trae.com.cn/)
  • Andriod Studio (https://developer.android.google.cn/studio?hl=zh-cn), 以下简称AS
    • 吃内存, 占用了我大约6GB内存
    • 下载项目依赖和安卓虚拟机(约2GB)依赖网络
  • 基础的编程知识

步骤

AS(Andriod Studio)创建项目

  • 在AS打开新窗口后, 等待右下角进度条初始化完毕(下载依赖和编译)

打开AS, 创建一个Empty Activity

在这里插入图片描述


在这里插入图片描述

AS创建虚拟机

启动模板项目

在这里插入图片描述


在这里插入图片描述

找到镜像, 如果是灰色的, 需要点击下载图标进入下载界面(大约2G, 非常依赖网络)

在这里插入图片描述


在这里插入图片描述

在右上角创建虚拟机

在这里插入图片描述


在这里插入图片描述

TRAE CN 修改项目

  • 使用Trae打开该文件夹
  • 按下Ctrl+U开启右侧AI工具

按下Ctrl+P, 在顶部打开的输入框中输入Main, 选择MainActivity.kt

在这里插入图片描述

新增按键捕获功能

  • 输入提示"我想要安卓应用可以捕获键盘的上下2个方向键并打印日志信息"
  • 鼠标点击模拟器中的应用的白色区域, 后按下上下键, 可看到日志输出

切换到日志查看界面

在这里插入图片描述

打开AS, 会自动刷新代码, 点击右上角的绿色重启按钮或者启动按钮重新编译和启动

在这里插入图片描述


在这里插入图片描述

生成完毕后, 在提示框的上方选择"全部接受"

在这里插入图片描述

新增WebView

  • 输入提示"我想将Greeting中的Text控件替换为Webview"
    • 生成完毕后, 选择"全部接受"
  • 回到AS, 点击右上角的绿色重启按钮或者启动按钮重新编译和启动
  • 回到TRAE, 输入提示信息界面提示"webpage not avalible"
    • 在点击"全部接受"前, 我看了修复内容, 它没添加网络权限还把地址改成google了, 这个方案是不行的, 所以点击"全部拒绝"
  • 重新输入提示"应该是没有配置网络权限, 修复一下"
    • 它给"AndroidManifest.xml"的文件内容清空了, 添加了一行权限代码, 这个方案是不行的, 所以点击"全部拒绝"
  • 重新输入提示"应该是没有配置网络权限, 添加一下相关的权限, 注意不要影响原有的配置信息"
  • 还是无法打开页面
  • 此时发现按键事件的捕获失效了
  • 回到AS, 编译报错了, 把提示信息MainActivity.kt:61:17 Modifier 'override' is not applicable to 'local function'发给TRAE
    • 新回复删除了override解决了报错, 但是没有解决按键的问题
  • 重启项目, 成功解决按键问题

重新输入提示"不行, 按键事件还是没有被APP捕获到", 生成了新回复

在这里插入图片描述

输入提示信息"按键事件被Webview捕获了导致应用程序的无法捕获上下键了, 修复一下" (这里我之前尝试过几次提问, 最后发现是Webview优先处理了事件导致的)

在这里插入图片描述

还是不行, 换了百度网址也不行, 打开自带的谷歌浏览器也访问不了网络, 最后是在下拉的通知栏里重新开关wifi后解决(上一步操作没有成功停止虚拟机)

在这里插入图片描述

重启后还是不能打开页面, 重启一下虚拟机

在这里插入图片描述


在这里插入图片描述

回到TRAE输入提示信息"还是提示"webpage not avalible", 是不是还缺少哪个网络权限", 给出新的修复

在这里插入图片描述

回到AS重启项目, 结果提示xml有问题, 仔细一看, 它代码加错位置了, 手动调整一下, 向下挪动一行

在这里插入图片描述

这次正确的添加了权限, 选择接受

在这里插入图片描述

出现了网络连接的错误

在这里插入图片描述

这里有个报错信息, 把鼠标移动到红色的文字上会给出提示, 点击import修复一下

在这里插入图片描述

WebView加载本地资源

  • 输入提示"我想打印webview都请求了哪些链接"
  • 输入提示"本地资源文件需要放在哪个目录, 帮我生成一个示例"

有2个导入报错, 鼠标移动到红色文字上, 给出了提示信息, 点击import导入一下, 重启项目

在这里插入图片描述

还需要修改一下拦截的地址(下面的日志打印又改回错误的了, 手动修复一下)

在这里插入图片描述

这里给出了2步, 一个是手动创建本地文件夹和文件, 一个是修改MainActivity.kt(没有自动修改, 可以点击应用按钮)

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

输入提示信息"我想在shouldInterceptRequest中拦截请求, 然后加载本地的资源文件"

在这里插入图片描述

新增了一个shouldInterceptRequest方法, 这里的斜杠是多余的, 导致没能正确打印日志, 手动删除一下

在这里插入图片描述


在这里插入图片描述

在按键回调中向WebView注入JS代码

  • 输入提示信息"我想在onKeyDown的回调中修改WebView中的显示内容"
  • 输入提示信息"我想在onKeyDown的回调中修改Greeting中创建的WebView中的显示内容"
    • 这次他给WebView加了个全局变量webViewInstance, 但是修改后的代码少了花括号, 手动修复一下
  • 发现没效果, 手动加了日志打印了一下日志发现webViewInstance是空的
  • 输入提示信息"webViewInstance是null, 是不是哪里有问题, 导致没赋值成功"
    • 只是加了日志, 没解决
  • 输入提示信息"Greeting 中返回 webView 的时候, webView 还没初始化吧?"
    • 发癫了, 胡乱输出
  • 输入提示信息"AndroidView 中是不是异步执行的, 导致返回的webview是null"
    • 偷懒了, 不想解决问题, 一味的加日志
  • 输入提示信息"已打印日志确认Greeting中返回的webView是null"
  • 输入提示信息"通过日志发现WebViewReturn提示webView有值, WebViewRequests处为null, 且WebViewRequests 先WebViewReturn输出, 可以确定AndroidView异步执行导致的返回null, 修复一下"
    • 这次改成了回调的方式, 成功解决
  • 在控制台直接粘贴JS, 发现js没有问题

重启, 按下上键, 成功解决

在这里插入图片描述

输入提示信息"evaluateJavascript 没有效果", 给出新修复

在这里插入图片描述

发现没效果, 打开Edge, 访问"edge://inspect/#devices", chrome不行, 会超时然后显示404

在这里插入图片描述

没注意看, 重新输入提示"不要使用webViewInstance?.loadUrl, 使用注入JS的方式"

在这里插入图片描述

手动修改一下

在这里插入图片描述

输入提示信息"不要跳转到new-url, 而是执行JS代码"

在这里插入图片描述

还是加日志

在这里插入图片描述

给了一个通过findViewById实现的方法, 接受后发现不能用, 退回一下

在这里插入图片描述

最终关键代码

  • MainActivity.kt
package com.example.dm2 import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import com.example.dm2.ui.theme.DM2Theme import android.util.Log import android.view.KeyEvent import android.webkit.WebView import android.webkit.WebViewClient import android.webkit.WebResourceRequest import android.webkit.WebResourceResponse import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.viewinterop.AndroidView import java.io.IOException var webViewInstance: WebView?=nullclass MainActivity :ComponentActivity(){overridefunonCreate(savedInstanceState: Bundle?){super.onCreate(savedInstanceState) setContent { DM2Theme {Surface( modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background ){Greeting("Android"){ webView -> webViewInstance = webView }}}}}overridefunonKeyDown(keyCode: Int, event: KeyEvent?): Boolean {when(keyCode){ KeyEvent.KEYCODE_DPAD_UP ->{ Log.d("KeyEvent","上方向键被按下"+ webViewInstance) webViewInstance?.evaluateJavascript("document.body.innerText = new Date();",null)returntrue}}returnsuper.onKeyDown(keyCode, event)}}@ComposablefunGreeting(name: String, modifier: Modifier = Modifier, onWebViewCreated:(WebView)-> Unit ={}){val context = LocalContext.current AndroidView( factory ={ ctx ->val webView =WebView(ctx).apply{ settings.javaScriptEnabled =true Log.d("WebViewInit","WebView实例已创建: $this") webViewClient =object:WebViewClient(){overridefunshouldInterceptRequest(view: WebView, request: WebResourceRequest): android.webkit.WebResourceResponse?{val url = request.url.toString()if(url.equals("https://www.example.com/")){try{val inputStream = context.assets.open("example.html")returnWebResourceResponse("text/html","UTF-8", inputStream)}catch(e: IOException){ e.printStackTrace()}} Log.d("WebViewRequests","请求链接: ${request.url}")returnsuper.shouldInterceptRequest(view, request)}}loadUrl("https://www.example.com") isFocusable =false isFocusableInTouchMode =falsefunonKeyDown(keyCode: Int, event: KeyEvent): Boolean {returnfalse}}onWebViewCreated(webView)return@AndroidView webView }, modifier = modifier )}@Preview(showBackground =true)@ComposablefunGreetingPreview(){ DM2Theme {Greeting("Android")}}
  • AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?><manifestxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"><uses-permissionandroid:name="android.permission.INTERNET"/><uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/><uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/><applicationandroid:allowBackup="true"android:dataExtractionRules="@xml/data_extraction_rules"android:fullBackupContent="@xml/backup_rules"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.DM2"tools:targetApi="31"><activityandroid:name=".MainActivity"android:exported="true"android:label="@string/app_name"android:theme="@style/Theme.DM2"><intent-filter><actionandroid:name="android.intent.action.MAIN"/><categoryandroid:name="android.intent.category.LAUNCHER"/></intent-filter></activity></application></manifest>
  • example.html
<!DOCTYPEhtml><htmllang="zh-CN"><head><metacharset="UTF-8"><title>示例页面</title></head><body><h1>这是一个本地资源文件示例</h1><p>该文件从 Android 的 assets 目录加载。</p></body></html>

吐槽

  • java是大家闺秀, js是小伙子, kotlin简直是耍**, 那语法糖看的我抓耳挠腮

Read more

Stable Diffusion 秋叶大神2025最新整合一键安装包

Stable Diffusion 秋叶大神2025最新整合一键安装包

这段时间我在折腾 Stable Diffusion,期间试过很多安装方式。有手动安装的,也有别人做好的整合包。手动安装的方式对环境要求高,步骤也多,系统要装 Python,要装依赖,还要配好运行库,哪一步出错都要重新查资料,挺消耗时间。后来了解到秋叶大神做的整合一键安装包,这个版本省掉了很多折腾,对新手比较友好。 我自己把安装流程整理了一遍,又结合网上的信息,把一些需要注意的地方写下来,希望能帮到想尝试 Stable Diffusion 的人。 这里完整下载链接 秋叶整合包是什么 这个整合包属于别人已经帮你配好的版本,里面把 Stable Diffusion WebUI、模型管理、插件、运行环境都准备好了。下载之后按照提示解压,点一下启动脚本就能跑起来,不需要另外去折腾环境。 整合包里放的 WebUI 是常见的 AUTOMATIC1111 版本,所以大部分教程都能直接用。适合想直接出图、想先体验一下模型效果的人。 系统环境方面 我现在用的是 Windows 电脑,所以下面写的内容主要基于

腾讯云端Openclaw+飞书 多机器人配置全攻略(新手友好版)

前言:随着AI自动化工具的普及,Openclaw凭借强大的自主执行能力,成为很多人提升效率的首选;而飞书作为高效协同工具,其机器人功能可无缝融入日常工作流。当两者结合,配置多机器人实现分工协作(如办公提效、信息管理、场景化响应),能进一步释放AI价值。 本文将从前期准备、分步配置、实战调试到常见问题,手把手教你完成Openclaw+飞书多机器人配置,全程无复杂操作,新手也能快速上手,建议收藏备用! 一、配置前必看:核心说明与前置准备 1.1 核心价值 Openclaw+飞书多机器人配置,核心是让多个飞书机器人分别绑定Openclaw的不同Agent,实现「分工协作、各司其职」——无需切换工具,在飞书内即可完成所有操作,大幅提升工作效率。 ✅ 典型分工场景: * 1个机器人负责日常指令响应 * 1个机器人负责定时推送资讯 * 1个机器人负责办公流程自动化(会议整理、报表生成等) 1.2 前置环境准备(必做) 提前准备好以下环境和工具,避免配置过程中卡顿,所有工具均为免费可用: * 基础环境:云端安装Openclaw;

春晚顶流宇树机器人深度拆解:从武术表演到千亿产业落地

春晚顶流宇树机器人深度拆解:从武术表演到千亿产业落地

一、春晚名场面:国产机器人的“功夫秀”封神时刻 2026马年春晚,《武BOT》节目凭16台宇树G1/H2机器人的硬核表演刷屏全网——1.8米高的H2身着红袍舞剑,3米腾空后空翻落地稳如磐石,剑招精准度达±10mm,完美复刻“苏秦背剑”“白鹤亮翅”等经典招式;G1机器人耍双节棍时转速达2.3圈/秒,打醉拳时躯干摆动幅度±30°,与86名塔沟武校少年实现“人机拳拳相击”的零碰撞协同,动作同步误差低于0.1秒。更令人惊叹的是义乌分会场的创意呈现:H2机器人吊威亚登场化身齐天大圣,手持金箍棒完成360°旋转劈杀,四足机器人B2-W组成动态祥云矩阵,通过队形变换拼出“龙年大吉”字样,传统IP与科技感的融合引发全网热议。 这场表演创下三项世界纪录:全球首次全自主集群武术表演、人形机器人连续空翻最多(单脚3次)、人机协同复杂度最高(16台机器人+86人同步动作),#机器人全面入侵春晚# 话题阅读量破亿,央视评论称其“标志着中国具身智能进入实用化阶段”。而鲜为人知的是,这群“

WebStorm对个人免费开放

WebStorm对个人免费开放

前端开发的普惠革命:JetBrains WebStorm 非商业免费政策深度解析 2024 年 10 月 24 日,正值程序员节来临之际,JetBrains 抛出重磅消息:旗下旗舰级前端开发 IDE WebStorm 正式对非商业用途用户全面免费开放。这一举措不仅延续了 RustRover 的免费许可模式,更标志着专业级 Web 开发工具向大众化普及迈出了关键一步,为全球千万前端开发者带来了实质性利好。 一、政策内核:清晰界定的免费边界与权益 1. 非商业用途的精准定义 JetBrains 在 Toolbox 订阅协议中明确划分了免费使用的适用场景,覆盖群体远超传统教育优惠范畴: * 核心免费场景:包括前端技术学习与技能提升、无商业收益的开源项目贡献、技术博客 / 视频教程等内容创作、个人兴趣导向的 Web 开发(如自制工具、创意 demo)。值得注意的是,即使内容创作通过广告产生间接收益,仍属于非商业范畴。 * 商业付费边界:任何直接或间接获取经济收益的开发活动均需付费,