Android系统默认赋予浏览器权限以及Android恶意覆盖导致谷歌浏览器授权失败的解决办法

一、Android系统默认赋予浏览器权限

只要是设计到默认赋权,就在framework下找这个类:base/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
安卓系统开机的时候会调用这个类里面的下面这个方法:

 public void grantDefaultPermissions(int userId) {DelayingPackageManagerCache pm = new DelayingPackageManagerCache();grantPermissionsToSysComponentsAndPrivApps(pm, userId);grantDefaultSystemHandlerPermissions(pm, userId);grantSignatureAppsNotificationPermissions(pm, userId);grantDefaultPermissionExceptions(pm, userId);// Apply delayed statepm.apply();}

grantDefaultSystemHandlerPermissions方法里面会默认赋予浏览器权限

private void grantDefaultSystemHandlerPermissions(PackageManagerWrapper pm, int userId) {......// BrowserString browserPackage = ArrayUtils.firstOrNull(getKnownPackages(KnownPackages.PACKAGE_BROWSER, userId));if (browserPackage == null) {browserPackage = getDefaultSystemHandlerActivityPackageForCategory(pm,Intent.CATEGORY_APP_BROWSER, userId);if (!pm.isSystemPackage(browserPackage)) {browserPackage = null;}}grantPermissionsToPackage(pm, browserPackage, userId, false /* ignoreSystemPackage */,true /*whitelistRestrictedPermissions*/, FOREGROUND_LOCATION_PERMISSIONS);
}

代码中通过"Intent.CATEGORY_APP_BROWSER"这个标识去判断是否是浏览器应用,如果是浏览器应用将会通过grantPermissionsToPackage方法去赋予浏览器权限

@SafeVarargsprivate final void grantPermissionsToPackage(PackageManagerWrapper pm, String packageName,int userId, boolean ignoreSystemPackage, boolean whitelistRestrictedPermissions,Set<String>... permissionGroups) {grantPermissionsToPackage(pm, pm.getPackageInfo(packageName),userId, false /* systemFixed */, ignoreSystemPackage,whitelistRestrictedPermissions, permissionGroups);}

通过代码可以看到permissionGroups是一个可变参数,如果想给浏览器添加更多的默认参数只要在后面添加相应的权限即可,如下:

grantPermissionsToPackage(pm, browserPackage, userId, false /* ignoreSystemPackage */,

            true /*whitelistRestrictedPermissions*/, FOREGROUND_LOCATION_PERMISSIONS,NOTIFICATION_PERMISSIONS,STORAGE_PERMISSIONS,CAMERA_PERMISSIONS,MICROPHONE_PERMISSIONS);
二、Android恶意覆盖导致谷歌浏览器授权失败的解决办法

在通过谷歌浏览器使用zoom会议的过程中我们发现,当授予zoom会议摄像头或者麦克风权限的时候,点击确认授予权限时会弹出以下弹窗导致授权失败,从而导致zoom会议无法打开摄像头和麦克风。
![[Pasted image 20250703094224.png]]

首先我们借助AI工具看一下谷歌浏览器的源码,“此网站无法请求授权,请关闭来着其他应用的所有气泡和叠加层,然后重试”这个弹窗是什么条件下触发的,得到以下信息

谷歌浏览器(Chromium)中关于 “此网站无法请求授权” 错误提示的源码主要涉及权限请求拦截、覆盖层检测和用户界面通知三个核心模块。以下从源码层面解析其实现逻辑:

一、错误提示的触发条件

该错误通常在以下情况触发(基于content/browser/permission_manager模块):

  1. 存在屏幕覆盖层(如悬浮窗、输入法面板等)
  2. 权限请求被系统层拦截
  3. 渲染进程与浏览器进程通信中断
  4. 安全策略阻止跨域授权请求

二、核心源码分析

1. 覆盖层检测机制(Overlay Detector)

源码路径:content/browser/android/overlay_detector_android.cc

// content/browser/android/overlay_detector_android.cc
bool OverlayDetector::IsOverlayPresent() {// 获取系统窗口管理器服务WindowManager* wm = WindowManager::GetInstance();// 检查是否存在非系统级覆盖窗口std::vector<WindowInfo> windows = wm->GetAllWindows();for (const auto& window : windows) {if (!window.is_system_window && window.overlaps_application_area) {return true;  // 存在恶意覆盖层}}return false;
}
2. 权限请求拦截逻辑

源码路径:content/browser/permission_manager/permission_manager_impl.cc

// content/browser/permission_manager/permission_manager_impl.cc
void PermissionManagerImpl::RequestPermission(PermissionType permission,RenderFrameHost* render_frame_host,const GURL& requesting_origin,bool user_gesture,base::OnceCallback<void(PermissionStatus)> callback) {// 检查是否存在覆盖层if (overlay_detector_->IsOverlayPresent()) {// 触发覆盖层错误提示NotifyOverlayError(render_frame_host, requesting_origin);std::move(callback).Run(PERMISSION_STATUS_DENIED);return;}// 其他权限校验逻辑...
}void PermissionManagerImpl::NotifyOverlayError(RenderFrameHost* render_frame_host,const GURL& origin) {// 创建错误消息std::string error_message = "此网站无法请求授权,请关闭来自其他应用的所有气泡和叠加层,然后重试";// 通过WebUI发送错误通知到渲染进程WebUIMessageHandler::Send(render_frame_host,"chrome://overlay-error/",base::Value(error_message));
}
3. 用户界面通知实现

源码路径:chrome/browser/ui/android/overlay_error_dialog.cc

// chrome/browser/ui/android/overlay_error_dialog.java
public class OverlayErrorDialog {private final Activity activity;private final String origin;private AlertDialog dialog;public OverlayErrorDialog(Activity activity, String origin) {this.activity = activity;this.origin = origin;}public void show() {// 构建错误提示对话框AlertDialog.Builder builder = new AlertDialog.Builder(activity);builder.setTitle("授权失败").setMessage("此网站无法请求授权,请关闭来自其他应用的所有气泡和叠加层,然后重试").setPositiveButton("确定", (dialog, which) -> dialog.dismiss()).setIcon(R.drawable.ic_warning);dialog = builder.create();dialog.show();}public void dismiss() {if (dialog != null && dialog.isShowing()) {dialog.dismiss();}}
}
4. 系统权限交互逻辑

源码路径:content/browser/android/permission_request_controller_android.cc

// content/browser/android/permission_request_controller_android.cc
void PermissionRequestController::OnSystemPermissionsResult(int request_code,const std::vector<std::string>& permissions,const std::vector<int>& grant_results) {// 处理系统权限请求结果if (grant_results.empty() || grant_results[0] != PackageManager.PERMISSION_GRANTED) {// 权限被拒绝,检查是否因覆盖层导致if (overlay_detector_->IsOverlayPresent()) {ShowOverlayErrorDialog();} else {ShowPermissionDeniedDialog();}}
}

三、错误提示的显示流程

  1. 检测阶段:当网站请求敏感权限(如摄像头、位置)时,浏览器通过OverlayDetector检查屏幕上是否存在可疑覆盖层。
  2. 拦截阶段:若检测到覆盖层,PermissionManager会拦截权限请求,并调用NotifyOverlayError生成错误消息。
  3. 显示阶段OverlayErrorDialog将错误消息包装为系统对话框,并通过 Android UI 框架显示给用户。

四、相关配置与扩展点

  1. 覆盖层检测阈值:可通过chrome://flags中的overlay-detection-sensitivity标志调整检测灵敏度。
  2. 错误消息本地化:字符串资源定义在chrome/android/java/res/values/strings.xml中。
  3. 白名单机制:在content/public/common/overlay_whitelist.h中可配置允许的覆盖层应用。

五、解决思路与源码关联

当遇到 “此网站无法请求授权” 错误时,可从以下源码角度排查:

  1. 覆盖层检测失败:检查OverlayDetector::IsOverlayPresent()的返回逻辑。
  2. 权限请求流程中断:调试PermissionManagerImpl::RequestPermission()的执行路径。
  3. UI 显示异常:检查OverlayErrorDialog的生命周期管理。

再通过AI工具检查一下OverlayDetector::IsOverlayPresent()方法的返回逻辑,得到以下信息

在 Chromium 源码中,OverlayDetector::IsOverlayPresent() 方法用于检测屏幕上是否存在可能干扰浏览器权限请求的覆盖层(如悬浮窗、恶意叠加层等)。其返回逻辑涉及系统窗口管理、应用权限检查和窗口属性分析,以下是核心实现解析:

一、方法核心逻辑

源码路径:content/browser/android/overlay_detector_android.cc

bool OverlayDetector::IsOverlayPresent() {// 1. 获取系统窗口管理器服务WindowManager* wm = WindowManager::GetInstance();if (!wm)return false;// 2. 获取所有可见窗口列表std::vector<WindowInfo> windows = wm->GetVisibleWindows();// 3. 检查每个窗口是否为可疑覆盖层for (const auto& window : windows) {// 跳过系统信任的窗口类型if (IsSystemTrustedWindow(window))continue;// 检查窗口是否与浏览器内容区域重叠if (window.overlaps_browser_content) {// 检查窗口是否具有高风险属性if (IsHighRiskOverlay(window)) {LOG(WARNING) << "检测到高风险覆盖层: " << window.title;return true;}// 累积非系统窗口计数non_system_window_count_++;}}// 4. 判断非系统窗口数量是否超过阈值if (non_system_window_count_ > kMaxAllowedNonSystemWindows) {LOG(WARNING) << "非系统覆盖层数量过多: " << non_system_window_count_;return true;}return false;
}

二、关键辅助方法解析

1. 系统信任窗口判断
bool OverlayDetector::IsSystemTrustedWindow(const WindowInfo& window) {// 系统状态栏、导航栏等属于信任窗口if (window.type == WINDOW_TYPE_STATUS_BAR ||window.type == WINDOW_TYPE_NAVIGATION_BAR) {return true;}// 输入法窗口属于信任窗口(但需特殊处理)if (window.type == WINDOW_TYPE_INPUT_METHOD) {return is_keyboard_trusted_;}// 检查窗口是否由系统签名应用创建if (window.is_system_signed) {// 部分系统应用仍需进一步验证if (IsSystemAppWithOverlayPermission(window.package_name)) {return true;}}return false;
}
2. 高风险覆盖层判断
bool OverlayDetector::IsHighRiskOverlay(const WindowInfo& window) {// 检查窗口是否为"TYPE_APPLICATION_OVERLAY"类型(Android 8.0+的悬浮窗类型)if (window.type == WINDOW_TYPE_APPLICATION_OVERLAY) {// 检查窗口是否请求了危险权限if (HasDangerousPermissions(window.package_name)) {return true;}// 检查窗口是否来自已知风险应用if (IsKnownRiskyApp(window.package_name)) {return true;}}// 检查窗口是否具有不透明全屏特性if (window.is_opaque && window.covers_entire_screen) {return true;}return false;
}
3. 窗口与浏览器内容区域重叠判断
bool OverlayDetector::DoesWindowOverlapBrowserContent(const WindowInfo& window) {// 获取浏览器内容区域坐标gfx::Rect content_area = GetBrowserContentArea();// 检查窗口边界是否与内容区域相交return window.bounds.Intersects(content_area);
}

从以上的源码我们可以看到,如果是系统信任的窗口则直接跳过返回false,如果是窗口与浏览器窗口叠加并且是被判断为窗口具有高风险属性则返回true,弹窗就会弹出。这时候可以判断是系统的某个应用,覆盖在了浏览器的上层或者和浏览器在同一层级,并且具有高风险属性。通过代码排查,以下应用会一直显示在上层。打开谷歌浏览器时截屏并未打开,那只可能是侧边栏的问题了,这时候我们去设置菜单里面设置一下把侧边栏给隐藏掉,这时候再去打开zoom会议授权,发现授权成功了,弹窗没有弹出来,我们可以确定该问题是侧边栏导致的,查看侧边栏源码发现侧边栏使用TYPE_APPLICATION_OVERLAY类型并且请求了危险权限,这下就解释得通了。

接下来要怎么处理该问题,最好的办法就是看一下能不能把侧边栏设置为系统信任的窗口,再次使用AI我们得到了以下解决办法。

  1. 申请系统签名

    • 通过 OEM 合作或设备定制,为应用获取系统签名,从而使用PRIVATE_FLAG_TRUSTED_OVERLAY标志:
      // 系统应用才能生效的代码
      if (isSystemApp()) {params.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_TRUSTED_OVERLAY;
      }
      
  2. 加入设备白名单

    • 与设备厂商合作,将应用添加到浏览器的信任白名单中:

      // 设备特定配置(非公开API)
      chrome://flags/#overlay-allowed-apps=com.your.app
      

显然第一种方法是比较行得通的,侧边栏已经是系统应用,我们只需要添加PRIVATE_FLAG_TRUSTED_OVERLAY标志位即可,修改如下,即可解决恶意覆盖导致授权失败问题,该问题最后修改的地方比较简单只有一行,但是问题的处理和排查过程会相对麻烦一些,这也是大部分系统级问题的通病。其他应用(如悬浮球等应用的解决思路也是一样的),只不过该属性在安卓frameworks中是隐藏的,在悬浮球等应用中需要通过反射调用,这方面我们就不去讲解了。

![[Pasted image 20250703102302.png]]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/87336.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/87336.shtml
英文地址,请注明出处:http://en.pswp.cn/web/87336.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

矩阵的秩 线性代数

定义和求法 关于秩的几个重要式子 例题 给出秩&#xff0c;那我们就有三个知识点&#xff0c;一个是用定义&#xff0c;一个是用求法&#xff0c;一个是重要式子。 题目没什么好翻译的&#xff0c;基本就是赤裸裸的跟你坦白了直说了。 接下来就是解法了。用定义的话就是说这个…

【大模型】基于MCP的mysql 服务构建及使用(python语言)

前言 ​ 在之前使用dify来编排AI智能体&#xff0c;有这样的一个场景&#xff0c;希望智能体能自动读取数据库数据&#xff0c;获得统计数据&#xff08;问数&#xff09;&#xff0c;最终生成报告。 ​ 当时实现思路是&#xff0c;通过知识库告诉大模型相关表的字段定义&…

OA退位,如何打造安全便捷的跨网文件传输与即时通讯平台?

随着医院信息化建设深入推进&#xff0c;OA 系统在日常流程审批和文件流转中扮演着不可或缺的角色。然而&#xff0c;面对“内网⇄外网”强隔离的安全要求&#xff0c;OA 在跨域传输上仍然存在审批延迟、人工干预、病毒风险等痛点。 一、OA 在跨网传输中的 “ 最后一公里 ” 难…

LlamaIndex的多轮对话引擎使用说明

一、背景 LlamaIndex提供2种交互引擎&#xff1a;查询引擎和聊天引擎。&#xff08;详情请看这里&#xff09;查询引擎默认没有上下文信息&#xff0c;也就是说默认是单轮对话。 在RAG系统中&#xff0c;单轮对话/单次查询的场景较少&#xff0c;而多轮对话则是最常见的场景&…

【CSS-14.1-全局样式表common.css】构建高效可维护的 common.css:现代前端CSS架构指南

在前端开发中&#xff0c;CSS管理一直是项目可维护性的关键挑战。据统计&#xff0c;约35%的样式问题源于缺乏统一的CSS架构规范。common.css&#xff08;或称全局样式表&#xff09;作为项目的基础样式层&#xff0c;能够有效解决以下问题&#xff1a; 样式碎片化&#xff1a…

laravel基础:php artisan make:model Flight --all 详解

在 Laravel 中执行命令: php artisan make:model Flight --all这个命令会为你创建与模型 Flight 相关的一整套文件结构。Laravel 的 Artisan 命令行工具是一个强大的代码生成器,可以帮助你快速生成常见的应用组件。我们来详细解析一下这个命令的各个部分以及它产生的效果。 …

poi java 删除word的空白页

开发的时候遇到的问题&#xff0c;特此记录一下 使用Apache POI&#xff08;Java库&#xff09;删除Word文档中的空白页时&#xff0c;需针对不同场景处理。以下是具体实现方法和代码示例&#xff1a; 基础删除&#xff08;段落/分页符&#xff09;‌ 通过删除多余段落标记或…

获取Android应用日志教程

ADB&#xff0c;全称为Android Debug Bridge&#xff0c;是Android开发中一个重要的命令行工具。它用于与Android设备进行通信&#xff0c;提供了多种功能来帮助开发者进行调试和应用管理。 一、环境准备 1.PC下载附件中的安装包。 2.在设备上启用开发者选项和 USB 调试 在安卓…

【Axum】Rust Web 高效构建:Axum 框架从入门到精通指南

目录 一、环境准备与项目创建1.1 安装 Rust 工具链1.2 创建项目并添加依赖 二、Axum 核心架构解析三、项目结构设计四、核心代码实现4.1 应用入口 (src/main.rs)4.2 数据模型 (src/models.rs)4.3 路由配置 (src/routes.rs)4.4 认证服务 (src/services/auth.rs)4.5 用户处理器 (…

康谋分享 | 基于多传感器数据的自动驾驶仿真确定性验证

目录 01 引言 02 随机性的前因与后果 03 确定性的验证——以aiSim为例 1、传感器选型与配置 2、场景与方法 3、验证结果 04 总结 01 引言 随着自动驾驶技术的飞速发展&#xff0c;仿真测试已成为替代成本高昂且充满风险的道路测试的关键环节。它能够在虚拟环境中模拟…

FASTAPI+VUE3平价商贸管理系统

一、项目概述 PJMall 是一个基于 FastAPI 构建的商城管理系统后端服务&#xff0c;提供商品管理、订单处理、用户认证等核心功能。系统采用分层架构设计&#xff0c;支持高并发访问&#xff0c;适用于多角色用户&#xff08;管理员、客户、供应商&#xff09;。 核心特性 &a…

客服机器人知识库怎么搭?智能客服机器人3种方案深度对比(含零售落地案例)

一、知识库技术缺陷的权威数据 IDC 2025报告&#xff1a;89%企业因知识库更新延迟导致智能客服机器人解决率下降40%&#xff0c;传统规则引擎日均失效对话超2000次。 二、三大技术方案架构解析 1.LLM动态知识图谱方案 基于Transformer架构实时抓取政策/价格数据 知识关联度…

JavaScript 性能优化实战:减少 DOM 操作引发的重排与重绘

在前端开发中&#xff0c;DOM 操作是 JavaScript 性能优化的核心痛点之一。频繁的 DOM 操作会触发浏览器的 重排&#xff08;Reflow&#xff09; 和 重绘&#xff08;Repaint&#xff09;&#xff0c;导致性能显著下降。本文将深入分析这一瓶颈&#xff0c;并通过实际案例展示优…

力扣 hot100 Day33

24. 两两交换链表中的节点 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 //抄的 class Solution { public:ListNode* swapP…

DevExpress V25.1 版本更新,开启控件AI新时代

WinForms Controls v25.1 AI 驱动的语义搜索 我们的 WinForms 数据网格、GridLookUpEdit 和 SearchLookUpEdit 控件具有增强的搜索体验&#xff0c;使用户能够更快/更准确地在大型数据集中查找相关数据。与基于关键字的标准搜索不同&#xff0c;语义搜索利用自然语言处理 &…

【分层图 虚拟节点】 P11327 [NOISG 2022 Finals] Voting Cities|普及+

本文涉及知识点 C图论 P11327 [NOISG 2022 Finals] Voting Cities 题目描述 你所在的国家的国家主席 L o r d P o o t y \bf{Lord\ Pooty} Lord Pooty 将要退休了&#xff01;他希望选择他的一个儿子作为他的继承人&#xff0c;出于各方面因素的考虑&#xff0c;他决定进行…

Web3云服务商安全性怎么选

Web3安全之锚&#xff1a;为何阿里云是企业级应用的首选​ 随着Web3、去中心化金融&#xff08;DeFi&#xff09;和数字资产的浪潮席卷全球&#xff0c;无数开发者和企业涌入这个充满机遇的新赛道。然而&#xff0c;机遇背后是同样巨大的安全挑战。从智能合约漏洞到大规模DDoS…

uniapp加上全局水印

文章目录 一、效果图二、创建watermark.js文件三、在main.js中引入四、运行 前言&#xff1a;uniapp页面加水印你还在傻乎乎的一个个页面加吗&#xff0c;今天教你一招&#xff0c;一步到位 一、效果图 未登录效果 登录后效果 二、创建watermark.js文件 这里的水印因为我…

thinkphp8.0七牛云直传图片

环境&#xff1a;tp8\php8.3; 服务器&#xff1a;centOS Stream 9; 场景&#xff1a;通过html页面直传七牛云服务器&#xff0c;速度更快&#xff1b; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta na…

Godot x openKylin 全国开发大赛正式启动

从2023年开始&#xff0c;Godot Hub 每年举办一次 Godot Hub Festival 开发大赛&#xff0c;现已成为国内 Godot 社区规模最大的开发比赛。本届 Godot Hub Festival 2025将与 OpenAtom openKylin 开源社区合作举办&#xff0c;定名为 Godot x openKylin 全国开发大赛&#xff0…