如何在 Android 上注册的应用程序中从我的 WebView 中启动 Web 链接?

2024-04-19

在我的 Android 应用程序中,我有一个 WebView。我想every在我的 WebView 中单击链接以启动我的设备上已注册的应用程序(如果有),否则在外部浏览器中打开。例如,如果用户从 WebView 中单击 Facebook 页面链接,则应启动 Facebook 应用程序(如果 facebook 已在设备上注册以处理 facebook 链接)。如果没有注册应用程序,它应该启动外部浏览器(即,它不应该在同一 WebView 中加载页面)。

目前(默认情况下),WebView 仅加载在 WebView 自身内单击的任何链接。

我意识到我需要重写 shouldOverrideUrlLoading 来拦截这些链接点击:

webView.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        // what should go here to trigger the registered app or fall back to external browser for all link clicks in the WebView?
    }
}); 

我还查看了意图过滤器,但这似乎与此要求相反(意图过滤器似乎是我注册的一种方式myandroid 应用程序来处理其他地方的网络点击)。

Update 1:

I am not想要拦截任何特定的主机名或方案 - 我想要every在我的网络视图中单击的链接将“委托”给Android,其中Android决定是否启动已注册的应用程序,弹出一个选项供用户选择要在哪个应用程序中打开,或者在网络浏览器中打开,具体取决于用户设置。

具体来说,如果我点击链接https://www.facebook.com/blah https://www.facebook.com/blah它应该在 Facebook 应用程序中启动并带我到那里的 blah 页面。


该修复仅涉及将 shouldOverrideUrlLoading 处理为 true,如果该 url 不在我自己的应用程序内,则返回 true。返回 true 时,它​​将启动注册的应用程序或应用程序选择器对话框或浏览器,具体取决于配置的上下文。

mWebview.setWebViewClient(new WebViewClient()
{
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        boolean isLocalUrl = false;
        try {
            URL givenUrl = new URL(url);
            String host = givenUrl.getHost();
            if(host.contains("myapp.com"))
                isLocalUrl = true;

        } catch (MalformedURLException e) {

        }

        if (isLocalUrl)
            return super.shouldOverrideUrlLoading(view, url);
        else
        {
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            startActivity(intent);
            return true;
        }
    }
});

我还意识到 Android 上的当前状态(我在小米 Mi 4 上的 MIUI 7 上进行了测试,基于 Android Kitkat,但论坛表明至少对于大多数棉花糖之前的 Android 来说这基本上是正确的),其中指向 facebook 页面的链接WebView 未在 Facebook 应用程序中打开。它也不为用户提供在 Facebook 应用程序中打开的选项。这以前可以用,但现在不行了。如果我们使用上面的代码,它总是在浏览器中启动。很多误会都是因为这个发生的。它与其他网站(twitter、quora 等)按预期工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Android 上注册的应用程序中从我的 WebView 中启动 Web 链接? 的相关文章

  • 如何在 AndroidEnvironment 构建文件的环境变量中指定下载目录的路径

    使用 Visual Studio 2022 17 2 0 Preview 1 0 我目前正在尝试创建一个 MAUI 应用程序 该应用程序已经在 Windows 上运行良好 也可以在 Android 下运行 该应用程序使用一个库 SaxonC
  • 工具栏下方的白条

    所以我有一个带有工具栏的应用程序 工具栏下方出现一个白条 最后的屏幕截图 我不希望那个栏在那里我尝试添加 maxHeight 以查看它是否有效 但没有运气 这是我的样式和 v21 style xml style
  • 前台服务不持续运行

    在我的应用程序中 我使用必须不断运行的前台服务 有时前台服务会停止 在什么情况下操作系统会终止我的服务 即使有足够的内存 电池已充满 手机正在充电也会发生 到目前为止 我的代码是这样的 public class ServiceTest ex
  • 如何从命令行向 Android 项目添加外部 jar 库

    我正在尝试构建一个具有一些依赖项的 Android 项目 jar 文件位于 lib 目录中 我可以通过将这些 jar 文件添加到我的类路径来构建项目 但当然它会在模拟器中强制关闭 因为这些库不存在 我正在使用 ant 从命令行执行此操作 n
  • Android Studio 3.1 无法解析符号(主题、小部件、attr 等)

    我今天将 Android Studio 升级到 3 1 现在 Android Studio 表示无法解析大多数资源的符号 例如ThemeOverlay in styles xml or attr actionBarSize 到目前为止 这似
  • 使用 ActionBar 选项卡进行导航时菜单会折叠

    我已经使用支持库中的 ActionBar 来将我的应用程序构建为选项卡式导航栏 我的应用程序中有两个选项卡 这两个片段都有菜单 并且有一个菜单项 我想将其显示为操作栏中的一项操作 但由于某种原因 显示了溢出图标 而不是分配给这些项目的图标
  • 动态添加导航抽屉中的项目

    我创建了抽屉 但是我想动态设置抽屉的项目列表 意味着从数据库获取数据并设置为抽屉列表 是否可以 是的 比如何 我也知道静态抽屉 尝试这个 final Menu menu navigationView getMenu for int i 1
  • AppCompat SearchView 图标无法消失

    我正在使用 android support v7 widget SearchView 我需要让这个搜索图标消失 我有带有 SearchView 的自定义 ActionBar 布局
  • 从片段调用片段

    我想通过单击当前片段中的按钮来调用当前片段中的另一个片段 这是我的主要活动 import android app FragmentManager import android os Bundle import android support
  • 嵌套 CollectionView 和显示(使用 Visual Studio 2019、Xamarin XPlatform Android)

    嵌套 CollectionView 并在另一个中滚动 官方支持吗 显示这些集合问题 请参阅下面的我的数据模型和 XAML 代码 我没有可以放置生成的屏幕图像的站点 namespace Notes Models public class No
  • 为什么线性布局 maxHeight 不起作用?

    这是我的布局 我在线性布局上设置了最大和最小高度 但最大高度似乎不起作用 事实上如果TextView R id testo有很多文本 不会被修剪 如果我设置固定高度 则不会发生这种情况 但我不想设置固定高度 以便在选择溢出屏幕模式时正确调整
  • 如何从github项目获取jar? [复制]

    这个问题在这里已经有答案了 我想使用官方网站上的 kSoap2 android 库http simpligility github io ksoap2 android index html http simpligility github
  • 如何在对话框中显示/隐藏 Android 软键盘?

    在我的应用程序中 自定义对话框位于 BaseExpandableListAdapter 类中 在对话框中我有两个编辑文本 首先是名称及其强制性 其次是解决其可选问题 还有两个按钮 确定 和 取消 当对话框显示时 我想显示带有请求焦点的键盘以
  • 永远不要关闭 Android SQLite 连接

    如果您根本不关闭连接会发生什么 我知道如果您不关闭它并尝试打开另一个单例 您会遇到异常 但是如果您有一个全局单例 并且您只是不关闭它 会发生什么情况 任何想法 时空连续体中形成了裂痕 威胁着宇宙中所有生命的灭绝 直到一群穿着鲜艳滑稽服装的人
  • 使用“adb devices”命令无法找到 Android 设备

    我正在开发Android申请于macOS我的应用程序在模拟器上运行良好 我想在设备上运行它 但是当我运行时adb devices我什么也没得到 localhost platform tools BF adb devices List of
  • 共享 Google 地图或拍摄 Android 手机屏幕截图

    我正在使用 android google map api v2 开发 android 应用程序 到目前为止我已经取得了以下成绩 打开谷歌地图显示用户的位置 当他行走时 他可以在地图上添加标记 标记他经过的地方 他可以删除标记或拖动它们 我现
  • 如何在Android模拟器中找到数据库文件的路径?

    我正在 Android 模拟器中执行一些 sqlite 查询 我想知道数据库文件存储在哪个路径 请给我一些如何找到它的想法 如果你能给我一些代码片段 乌尔 s 库马兰 数据库通常存储在 data data your applications
  • 如何展开和折叠列表视图中的项目

    我对安卓还很陌生 我想实现一个列表视图 它包含一些列表项 当单击它们时 它们应该展开以显示更多信息 但我找不到办法做到这一点 这是我的activity main xml
  • Fragment中有类似setResult()的方法吗?

    我正在使用一个片段 我收到错误onResult 方法 我需要一个替代方法setResult RESULT OK data 我可以在我的片段中使用它 请帮忙 日历片段 package app pal study samplestudy imp
  • 总小时数无法从 Android 插入 MySQL

    我使用以下公式获得总小时数 public void updateTotalHours int a SplitTime objMyCustomBaseAdapter getFistTime int b SplitTime objMyCusto

随机推荐

  • 在一个上下文中禁用 python 模块的日志记录,但在另一个上下文中禁用

    我有一些代码使用requests与日志 API 进行通信的模块 然而 requests本身 通过urllib3 进行日志记录 当然 我需要禁用日志记录 以便对日志记录 API 的请求不会导致日志无限循环 所以 在我进行日志记录调用的模块中
  • 使用 argparse 的 Python 组之间的依赖关系

    我开始学习Python 现在我正在学习Python的巨大好处argparse Using argparse 我创建了两组参数 group list and group simulate 每个组都有自己的参数 用户只能在每个组中指定一个参数
  • Android Facebook SDK v3.0 SSO LoginButton 返回 null GraphUser

    所以我有一个简单的登录按钮 可以在我的 oncreate 中执行此操作 mLoginButton LoginButton findViewById R id connect facebook button mLoginButton setA
  • C++ 使用对正在定义的变量的引用

    根据标准 不考虑 以下代码是否有效 C bool f T r if r return true return false T x f x x T 众所周知 要在该项目使用的 GCC 版本中进行编译 4 1 2 和 3 2 3 甚至不让我开始
  • 错误:EMFILE:打开的文件太多,请注意,除非我使用 sudo

    描述 最近我遇到了一个问题 我无法奔跑yarn start in element web目录 我得到这些errors https pastebin ubuntu com p 93v6Yx58DT 原本我以为这与element web本身所以
  • 如何以编程方式精确查找 PPI

    我正在尝试找出 iOS 中的 PPI 每英寸像素 我找不到任何直接的方法来查询它 就像我们查询显示尺寸一样 UIScreen mainScreen bounds 有一个方法 https stackoverflow com a 7922666
  • Xcode 升级到 4.5 后应用程序崩溃。将保留对象分配给 unsafe_unretained 变量

    在我的班级里 我有一个dispatch queue t属性声明如下 property nonatomic assign dispatch queue t queue 然后在我的 init 方法中我这样做 id initWithServerU
  • 在詹金斯管道的多个步骤中定义和访问变量

    我是从这个帖子来到这里的在 Jenkins Pipeline 的 shell 脚本部分定义变量 https stackoverflow com questions 51407976 defining a variable in shell
  • 在训练期间启用和禁用变量学习

    我想在训练期间开始或停止变量的学习 虽然Variable的构造函数有一个trainable参数 该参数构建后不可更改 为了实现这种效果 我当前的解决方案是在我想要更改变量的可训练状态时保存模型 将变量设置为所需的可训练状态来重建网络 然后重
  • 每月第二个星期一的 Cron 表达式(对于 Hangfire)

    我正在尝试在 Hangfire 中创建定期作业 每月第二个星期一运行一次 如下所示 1 Monday May 14 2018 8 00 AM 2 Monday June 11 2018 8 0 AM 3 Monday July 9 2018
  • 在编译时检测编译器版本

    这既是一个问题 也是一个参考 我希望人们能够在此基础上进行构建 以便有类似问题的人可以重用它 我们如何可靠地检测 C C ObjC 编译器的特定版本 现在我知道了 Visual Studio 的答案 并部分知道了 Xcode 的答案 现在
  • JSF 1.2 startElement 和 writeAttribute 解释

    我有机会为我的项目编写一些自定义渲染器 并且运行得非常好 然而 我对 ResponseWriter 方法中的一些参数有些困惑 该文档没有很好地解释这一点 因此我希望一位常驻 JSF 专家可以更好地解释这一点 具体来说 public abst
  • 在 powershell 中使用 %userProfile% 环境变量创建路径时出现意外行为

    我编写了一个脚本来创建一系列符号链接 我想将目标值设置为 shortpath 其中 shortpath userprofile dir1 dir2 dir3 filename ext shortpath 变量的值是有效的 我可以从运行命令打
  • C - 将大写字母转换为小写字母

    一个非常简单的程序 我只想将 A 变成 a 但输出给了我 A include
  • 类 VS 引用结构

    我正在使用 C 编写游戏 因此 我非常关心性能 我想知道主要区别是什么 如果可能的话 使用类传递数据或通过引用传递结构的性能考虑因素 出于性能原因 我希望不要复制数据 我假设通过 ref 传递比这里通过值传递要快得多 我知道类始终通过引用传
  • MS 缺少 VSTO 4.0 运行时下载?

    我们有代码检查 VSTO 4 0 运行时是否存在并下载 如果丢失 直到今天这一切都运作良好 MS 中的 VSTO 运行时文件似乎丢失了 有人对这个有了解吗 我们能否告诉客户这是 MS 问题并且很快就会得到解决 Google 没有找到任何有关
  • Serialized 和 DataContract(不是对比?)

    我正在阅读我的新项目中的一些代码 发现前开发人员同时使用 Serialized 和 DataContract Serializable and DataContract Namespace Some Name Space IsReferen
  • iTerm2 隐藏标记

    我最近安装了 iTerm2 的 Shell Integration 但在输入 shell 命令时它还添加了那些小箭头 称为标记 这真的很烦人 有什么方法可以禁用 隐藏它们 我在网上找不到 As per 文档 https www iterm2
  • 让 IIS6 与 WordPress 完美配合

    我有一个由 WordPress 驱动的博客 我正在尝试在 IIS6 服务器上进行设置 除了令我头疼的永久链接结构之外 一切正常 在谷歌搜索 wordpress codex之后 我了解到这是因为IIS6没有相当于Apache的mod rewr
  • 如何在 Android 上注册的应用程序中从我的 WebView 中启动 Web 链接?

    在我的 Android 应用程序中 我有一个 WebView 我想every在我的 WebView 中单击链接以启动我的设备上已注册的应用程序 如果有 否则在外部浏览器中打开 例如 如果用户从 WebView 中单击 Facebook 页面