前言

上一篇文章继续。

先整理一下现在的情况:

  • ✅支持多行文本的 EditText。

  • ✅Button 监听事件处理文本、提交给 WebView。

    • ✅判定是否有关键网址。
    • ✅通过正则表达式提取短链接。
    • ✅不符合上述情况弹出 Toast 提示。
    • ✅通过 intent 启动 WebViewActivity 并传递 URL。
  • ✅WebView 放在新的 Activity 里面,由 Button 启动。

    • ✅通过 WebViewClient 方法优先使用 https。
    • ✅忽略 SSL 证书错误。
    • ✅从 intent 获取 URL 并加载。

上一篇文章结尾提到了整个的操作流程:

通过 app 的分享功能获取到文本:

1
4.66 复制打开抖音,看看【西诺说影的作品】站直啰,别趴下(第一视角) 冯巩主演,一部让人看完... https://v.douyin.com/i5chLVyT/ W@M.jp OKj:/ 09/17 

提取出短链接:

1
https://v.douyin.com/i5chLVyT/

浏览器的UA使用PC模式,获取到网址:

1
https://www.douyin.com/video/7479005522700635418

通过网址提取到视频ID:

1
7479005522700635418

将视频 ID 给开放端口:

1
https://open.douyin.com/player/video?vid=7479005522700635418

将网址放进浏览器里打开

就如何实现这个过程,进一步展开。

阻止跳转到APP

首先遇到的第一个问题:直接打开该链接的话,由于网页会自动尝试跳转到 app,导致出现错误。

如果正常使用手机里的浏览器打开,应该会弹出下面的提示:

很明显 WebView 对于自定义 URL scheme 没有默认处理方法,得自己写。

好了,到现在为止基本功能都实现了:

  • ✅解析抖音的分享文本

  • ✅提取短链接

  • ✅打开链接并避免跳转到抖音 app。

短链接解析到长链接

我打算进一步尝试。

根据前言里说的,抖音的短链接在 PC 浏览器上会自动跳转到长链接。

而长连接里包含着一个关键信息:Video ID。

我先把短链接变长链接这一步实现。

看着挺复杂,而且 Gemini 只讲了 RedirectActivity.kt 的代码,没讲 MainActivity.kt 里的那些修改是什么意思。

在 Deepseek 的帮助下,我梳理了一下这些修改的作用:

  • 首先,新建了一个 RedirectActivity.kt 专门用来解析 URL。

    • 因为不可见,去掉了setContentView(R.layout.activity_redirect)
    • webView.settings.userAgentString 负责设置 UA。
    • 重写 shouldOverrideUrlLoading()onPageFinished() 把得到的 realUrl 给 sendResultAndFinish()
    • sendResultAndFinish() 把 realUrl 作为 intent 返回给 MainActivity,使用 finish() 结束生命周期。
    • setResult(RESULT_OK, resultIntent)设置当前 Activity 的结果为 RESULT_OK,并将 resultIntent 返回给调用方。
  • 接下来看 MainActivity.kt 的修改:

    • 定义了常量 REQUEST_CODE_REDIRECT 的值为 1
    • startActivityForResult(intent, REQUEST_CODE_REDIRECT)给 RedirectActivity 发送一个 intent,并且以 REQUEST_CODE_REDIRECT 作为这个请求的唯一标识(以免和别的搞混)。
    • onActivityResult() 针对 RedirectActivity 返回的结果进行处理
      • 判定请求代号是否是 REQUEST_CODE_REDIRECT,返回结果是否是 RESULT_OK
      • 从返回的 Intent 中获取 realUrl,并启动 WebViewActivity 来显示这个 URL。

看上去好像没啥问题,但总感觉哪里不太对劲……

实际运行也没有报错。

但是由于我并没有给 WebViewActivity.kt 设置UA,所以就算是加载的长链接,加载后又会自动跳转。

所以解析为长链接到底有没有成功,没法确认……

接下来为了验证,我给返回的 realUrl 加了一个 Dialog:

再尝试解析短链接,弹出 Dialog 如下:

此时的我还在想:为什么不是显示 douyin.com/video/XXXXXX 这样的链接?难道还有其它的跳转?

于是我又去问 AI,跑浏览器的 F12 工具。

大致是知道了这个 realUrl 是怎么获取到的了。

兜兜转转了半天,我才突然想到一件事:

我要的是 Video ID 啊!!!

这个时候脑子终于开窍了,Video ID 其实早就得到了,前面总在想着要跳转到 douyin.com/video/XXXXXX 才能获取,把自己牵制了 OTZ

现在回到一开始,其实在网页会自动尝试跳转到 app 的时候,给出的 URL 里面已经包含了 Video ID

自己饶了半天还是回到一开始了……

好吧,一天又过去了。

先到这里吧


🎵羽·泉 - 彩虹

接下来,对 WebView 做一些改进:

看来 WebView 并没有自带的地址栏组件,这里它是用的 EditText 作为地址栏。