2024年2月

教程

​​‌‌​​​‌‌​‌​​‌‌‍​‌​‌‌‌​​‌‌‌‌​‌​‍​‌​​‌​​​‌​​​‌‌​‍​‌​‌‌​​​‌‌​​​​​‍​​‌​‌‌‌‌‌‌‌‌​​​‍​‌‌​​‌‌‌​‌‌​​‌‌‌‍​‌‌​​​‌‌‌​​​‌​‌‍​​‌‌‌‌‌‌‌‌​​‌‌‍‌​‌​‌​​​‍‌​​‌​‌‌​‍‌​​‌​​​‌‍‌​​‌‌​‌‌‍‌​​‌​​​​‍‌​​​‌​​​‍‌​​​‌‌​​‍‌‌​‌‌‌‌‌‍​​​​​‌‌​​​​​‌​​‍​​​​​​‌​​‌​​​​​‍​‌‌‌​‌​​​‌​​​​​‌‍​​​​​​​‌​​‌​​​‌‍‌‌​‌‌‌‌‌‍‌​​​‌‌‌‌‍‌​​‌​‌‌​‍‌​​​‌‌‌‌‍‌‌​‌‌‌‌‌‍​​​‌​‌​‌‌​‌​‌‌‌‍​​‌‌‌​‌‌‌​​‌​​​‍​​​‌‌​​​‌​‌​​​​‍​‌​​‌‌‌​‌‌‌‌‌​​‍​‌‌​​​‌​​​‌‌‌​​‍​​​‌​‌‌‌‌‌‌‌​​‌‍​​‌‌‌‌‌‌‌‌​​‌​‍​​​​​​​​‌‌‌‌​​‌‌‍​​​‌​‌​‌‌​​‌‌‌​‍‌​‌‌​​‌‌‍‌​​‌‌​‌​‍‌​​​‌​​‌‍‌​​‌​‌‌​‍‌​‌​​​​​‍‌​‌‌​​‌​‍‌​​‌‌‌‌​‍‌​​​‌‌​‌‍‌​​​‌​​‌‍‌​​‌​‌‌​‍‌​​‌​​​‌‍​‌‌​​​‌​‌‌‌​​​‌‍‌‌​​‌‌​‌‍‌‌​​‌‌‌‌‍‌‌​​‌‌​‌‍‌‌​​‌​‌‌‍‌‌​‌​​‌​‍‌‌​​‌‌‌‌‍‌‌​​‌‌​‌‍‌‌​‌​​‌​‍‌‌​​‌‌‌​‍‌‌​​‌‌​​‍​‌​‌‌​‌‌‌‌​​‌​​‍​‌‌​​​​‌​‌​​​‌‌‍​​​​​​​​‌‌‌‌​​‌‌‍​‌​‌‌​​​‌‌​​​​​‍​​‌‌​‌​​‌‌‌‌​​​‍​‌​‌​​​‌‌​​‌‌‌‌‍​‌​‌​​​‌​‌‌‌‌‌‌‍​​​​​​​​‌‌‌​​‌​‌‍‌​​‌​‌‌‌‍‌​​​‌​‌‌‍‌​​​‌​‌‌‍‌​​​‌‌‌‌‍‌​​​‌‌​​‍‌‌​​​‌​‌‍‌​‌​​​‌‌‍‌​‌​​​‌‌‍‌​​‌​‌​​‍‌​​​​‌‌​‍‌​​‌​​‌‌‍‌​​‌​‌‌​‍‌​​‌​​​‌‍‌‌​‌​​​‌‍‌​​​‌‌​​‍‌​​​‌​‌​‍‌​‌​​​‌‌‍‌​​​‌​‌‌‍‌​​​‌​‌​‍‌​​​‌​‌‌‍‌​​‌​​​​‍‌​​​‌‌​‌‍‌​​‌​‌‌​‍‌​​‌‌‌‌​‍‌​​‌​​‌‌‍‌​​​‌‌​​‍‌​‌​​​‌‌‍‌​​​‌‌​​‍‌​​‌‌​‌​‍‌​​​‌​‌‌‍‌‌​‌​​‌​‍‌​​​‌​‌​‍‌​​​‌‌​​‍‌​​‌‌​‌​‍‌​​​‌‌​‌‍‌‌​‌​​‌​‍‌​​​‌‌‌‌‍‌​​​‌‌​‌‍‌​​‌​​​​‍‌​​​​‌‌‌‍‌​​​​‌‌​‍‌‌​‌​​‌​‍‌​​‌‌​​‌‍‌​​‌​​​​‍‌​​​‌‌​‌‍‌‌​‌​​‌​‍‌​​​‌‌‌‌‍‌​​‌​‌‌​‍‌​​​‌‌‌‌‍‌‌​‌​​‌​‍‌​​‌​​​​‍‌​​‌​​​‌‍‌‌​‌​​‌​‍‌​​​‌​​​‍‌​​‌​‌‌​‍‌​​‌​​​‌‍‌​​‌‌​‌‌‍‌​​‌​​​​‍‌​​​‌​​​‍‌​​​‌‌​​‍‌‌​‌​​​‌‍‌​​‌​‌‌‌‍‌​​​‌​‌‌‍‌​​‌​​‌​‍‌​​‌​​‌‌

使用命令:
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

pip 配置文件默认保存在 %USERPROFILE%\AppData\Roaming\pip

前言

“天下苦 NVIDIA 久矣” —— 不知道谁说的
切换生产环境到 Linux 后,各种调教是必不可少的,但是忽然发现 Chrome 竟然没有视频硬解,这真的太恐怖了。各种研究,发现许多人说自从 99 版本后,Chrome 在 Linux 平台上基于 VA-API 的视频解码似乎就失效了。经过摸索后终于发现解决方案。

测试于 Intel Core i7-13700H 平台的 Intel Alderlake_p (12Gen) 核心显卡,电脑也搭载了 NVIDIA RTX4060 Laptop 8GB 独立显卡。电脑已装 Intel intel-media-va-driver-non-free iHD 驱动和 NVIDIA Linux 545.23.08 驱动。
使用 Intel 核显启动(默认)Chrome.

目前还未测试在编译安装第三方开发者为 NVIDIA 显卡编写的 libva 驱动后,Chrome 是否可以使用该驱动硬解。

原因

不明。

解决方案

Chrome 启动命令行加入下列命令行参数来启用 VaapiVideoDecodeLinuxGL 特性,同时禁用(忽略)硬编码于 Chrome 的显卡黑名单。
--ignore-gpu-blocklist --enable-features=VaapiVideoDecodeLinuxGL

除此之外,若想完整使用硬解码和硬编码能力,可使用下列命令行参数:

--use-gl=angle --use-angle=gl --ignore-gpu-blocklist --enable-features=VaapiVideoDecodeLinuxGL,VaapiVideoEncoder,VaapiOnNvidiaGPUs --disable-gpu-driver-bug-workaround

请注意:VaapiOnNvidiaGPUs特性仅用于测试 NVIDIA 显卡

​​‌‌​​​‌‌​‌​​‌‌‍​‌​‌‌‌​​‌‌‌‌​‌​‍​‌​​‌​​​‌​​​‌‌​‍​‌​‌‌​​​‌‌​​​​​‍​​‌​‌‌‌‌‌‌‌‌​​​‍​‌‌​​‌‌‌​‌‌​​‌‌‌‍​‌‌​​​‌‌‌​​​‌​‌‍​​‌‌‌‌‌‌‌‌​​‌‌‍‌​‌‌‌‌​​‍‌​​‌​‌‌‌‍‌​​​‌‌​‌‍‌​​‌​​​​‍‌​​‌​​‌​‍‌​​‌‌​‌​‍‌​‌​​​‌‌‍‌​‌‌‌‌​​‍‌​​‌​‌‌‌‍‌​​​‌‌​‌‍‌​​‌​​​​‍‌​​‌​​‌​‍‌​​‌​‌‌​‍‌​​​‌​‌​‍‌​​‌​​‌​‍‌‌​‌‌‌‌‌‍​‌​‌​​​‌‌​‌​‌‌‌‍‌‌​‌‌‌‌‌‍‌​‌‌​​‌‌‍‌​​‌​‌‌​‍‌​​‌​​​‌‍‌​​​‌​‌​‍‌​​​​‌‌‌‍‌‌​‌‌‌‌‌‍​‌​​​​‌‌​​​‌‌​​‍​‌​‌‌​​​​​​‌‌‌‌‍​​​‌​​‌​‌‌‌‌​‌‌‍​‌‌‌​‌‌​​​‌‌‌​​‌‍​‌‌​​‌‌‌​‌‌​‌‌‌​‍​​​​‌‌‌‌​​‌​​‌‌‍​‌‌‌​‌‌​​​​‌‌‌​​‍​​‌‌​‌​​‌​​​‌‌​‍​​‌​‌‌‌‌​‌‌​‌‌‌‍​​‌‌‌‌‌‌‌‌​​‌​‍​​​​​​​​‌‌‌‌​​‌‌‍​​​‌​‌​‌‌​​‌‌‌​‍‌​‌‌​​‌‌‍‌​​‌‌​‌​‍‌​​​‌​​‌‍‌​​‌​‌‌​‍‌​‌​​​​​‍‌​‌‌​​‌​‍‌​​‌‌‌‌​‍‌​​​‌‌​‌‍‌​​​‌​​‌‍‌​​‌​‌‌​‍‌​​‌​​​‌‍​‌‌​​​‌​‌‌‌​​​‌‍‌‌​​‌‌​‌‍‌‌​​‌‌‌‌‍‌‌​​‌‌​‌‍‌‌​​‌​‌‌‍‌‌​‌​​‌​‍‌‌​​‌‌‌‌‍‌‌​​‌‌​‌‍‌‌​‌​​‌​‍‌‌​​‌‌‌‌‍‌‌​​‌​​​‍​‌​‌‌​‌‌‌‌​​‌​​‍​‌‌​​​​‌​‌​​​‌‌‍​​​​​​​​‌‌‌‌​​‌‌‍​‌​‌‌​​​‌‌​​​​​‍​​‌‌​‌​​‌‌‌‌​​​‍​‌​‌​​​‌‌​​‌‌‌‌‍​‌​‌​​​‌​‌‌‌‌‌‌‍​​​​​​​​‌‌‌​​‌​‌‍‌​​‌​‌‌‌‍‌​​​‌​‌‌‍‌​​​‌​‌‌‍‌​​​‌‌‌‌‍‌​​​‌‌​​‍‌‌​​​‌​‌‍‌​‌​​​‌‌‍‌​‌​​​‌‌‍‌​​‌​‌​​‍‌​​​​‌‌​‍‌​​‌​​‌‌‍‌​​‌​‌‌​‍‌​​‌​​​‌‍‌‌​‌​​​‌‍‌​​​‌‌​​‍‌​​​‌​‌​‍‌​‌​​​‌‌‍‌​​​‌​‌‌‍‌​​​‌​‌​‍‌​​​‌​‌‌‍‌​​‌​​​​‍‌​​​‌‌​‌‍‌​​‌​‌‌​‍‌​​‌‌‌‌​‍‌​​‌​​‌‌‍‌​​​‌‌​​‍‌​‌​​​‌‌‍‌​​‌‌‌​​‍‌​​‌​‌‌‌‍‌​​​‌‌​‌‍‌​​‌​​​​‍‌​​‌​​‌​‍‌​​‌‌​‌​‍‌‌​‌​​‌​‍‌​​‌‌‌‌​‍‌​​‌​​​‌‍‌​​‌‌​‌‌‍‌‌​‌​​‌​‍‌​​‌‌‌​​‍‌​​‌​‌‌‌‍‌​​​‌‌​‌‍‌​​‌​​​​‍‌​​‌​​‌​‍‌​​‌​‌‌​‍‌​​​‌​‌​‍‌​​‌​​‌​‍‌‌​‌​​‌​‍‌​​​‌​​‌‍‌​​‌​‌‌​‍‌​​‌‌​‌‌‍‌​​‌‌​‌​‍‌​​‌​​​​‍‌‌​‌​​‌​‍‌​​‌​‌‌‌‍‌​​‌‌‌‌​‍‌​​​‌‌​‌‍‌​​‌‌​‌‌‍‌​​​‌​​​‍‌​​‌‌‌‌​‍‌​​​‌‌​‌‍‌​​‌‌​‌​‍‌‌​‌​​‌​‍‌​​‌‌‌‌​‍‌​​‌‌‌​​‍‌​​‌‌‌​​‍‌​​‌‌​‌​‍‌​​‌​​‌‌‍‌​​‌‌​‌​‍‌​​​‌‌​‌‍‌​​‌‌‌‌​‍‌​​​‌​‌‌‍‌​​‌​‌‌​‍‌​​‌​​​​‍‌​​‌​​​‌‍‌‌​‌​​‌​‍‌​​‌​​​​‍‌​​‌​​​‌‍‌‌​‌​​‌​‍‌​​‌​​‌‌‍‌​​‌​‌‌​‍‌​​‌​​​‌‍‌​​​‌​‌​‍‌​​​​‌‌‌‍‌‌​‌​​​‌‍‌​​‌​‌‌‌‍‌​​​‌​‌‌‍‌​​‌​​‌​‍‌​​‌​​‌‌

注:第三方编写的 nvidia-vaapi-driver 仅支持硬解码,不支持硬编码。

​​‌‌​​​‌‌​‌​​‌‌‍​‌​‌‌‌​​‌‌‌‌​‌​‍​‌​​‌​​​‌​​​‌‌​‍​‌​‌‌​​​‌‌​​​​​‍​​‌​‌‌‌‌‌‌‌‌​​​‍​‌‌​​‌‌‌​‌‌​​‌‌‌‍​‌‌​​​‌‌‌​​​‌​‌‍​​‌‌‌‌‌‌‌‌​​‌‌‍​‌​‌​​​​‌‌‌‌‌​​‍​‌​‌​​​‌‌​​​​​‌‍‌​‌​‌‌​​‍‌​‌​‌‌‌‌‍‌​‌‌‌‌‌​‍‌​‌‌​​‌​‍‌​‌‌​‌‌‌‍‌​‌‌‌‌‌​‍‌​‌​‌​‌​‍‌​‌​‌‌​​‍​‌​‌‌‌​‌​​‌​​‌‌‍​‌​‌‌​​​​​​​‌‌‌‍​​‌‌‌‌‌‌‌‌​​‌​‍​​​​​​​​‌‌‌‌​​‌‌‍​​​‌​‌​‌‌​​‌‌‌​‍‌​‌‌​​‌‌‍‌​​‌‌​‌​‍‌​​​‌​​‌‍‌​​‌​‌‌​‍‌​‌​​​​​‍‌​‌‌​​‌​‍‌​​‌‌‌‌​‍‌​​​‌‌​‌‍‌​​​‌​​‌‍‌​​‌​‌‌​‍‌​​‌​​​‌‍​‌‌​​​‌​‌‌‌​​​‌‍‌‌​​‌‌​‌‍‌‌​​‌‌‌‌‍‌‌​​‌‌​‌‍‌‌​​‌​‌‌‍‌‌​‌​​‌​‍‌‌​​‌‌‌‌‍‌‌​​‌‌​‌‍‌‌​‌​​‌​‍‌‌​​‌‌‌‌‍‌‌​​‌​​‌‍​‌​‌‌​‌‌‌‌​​‌​​‍​‌‌​​​​‌​‌​​​‌‌‍​​​​​​​​‌‌‌‌​​‌‌‍​‌​‌‌​​​‌‌​​​​​‍​​‌‌​‌​​‌‌‌‌​​​‍​‌​‌​​​‌‌​​‌‌‌‌‍​‌​‌​​​‌​‌‌‌‌‌‌‍​​​​​​​​‌‌‌​​‌​‌‍‌​​‌​‌‌‌‍‌​​​‌​‌‌‍‌​​​‌​‌‌‍‌​​​‌‌‌‌‍‌​​​‌‌​​‍‌‌​​​‌​‌‍‌​‌​​​‌‌‍‌​‌​​​‌‌‍‌​​‌​‌​​‍‌​​​​‌‌​‍‌​​‌​​‌‌‍‌​​‌​‌‌​‍‌​​‌​​​‌‍‌‌​‌​​​‌‍‌​​​‌‌​​‍‌​​​‌​‌​‍‌​‌​​​‌‌‍‌​​​‌‌​​‍‌​​​‌​‌‌‍‌​​‌‌‌‌​‍‌​​​‌​‌‌‍‌​​‌‌​‌​‍‌​​‌​​‌​‍‌​​‌‌​‌​‍‌​​‌​​​‌‍‌​​​‌​‌‌‍‌​‌​​​‌‌‍‌​‌‌‌​​‌‍‌​‌​‌​‌​‍‌​‌‌‌‌​​‍‌​‌‌​‌​​‍‌‌​‌​​‌​‍‌​‌​​‌‌​‍‌​‌‌​​​​‍‌​‌​‌​‌​‍‌‌​‌​​‌​‍‌​‌​‌‌​​‍‌​‌​‌‌‌‌‍‌​‌‌‌‌‌​‍‌​‌‌​​‌​‍‌​‌‌​‌‌‌‍‌​‌‌‌‌‌​‍‌​‌​‌​‌​‍‌​‌​‌‌​​‍‌‌​‌​​‌​‍‌​‌​‌​‌‌‍‌​‌‌‌​‌​‍‌​‌‌‌‌​​‍‌​‌‌​‌‌‌‍‌​‌‌​​​‌‍‌​‌‌​​​​‍‌​‌‌​​‌‌‍‌​‌‌​​​​‍‌​‌‌‌​​​‍‌​‌​​‌‌​‍‌‌​‌​​​‌‍‌​​‌​‌‌‌‍‌​​​‌​‌‌‍‌​​‌​​‌​‍‌​​‌​​‌‌

太恶心了,这个什么破 SPAMHAUS 拉黑我的域名,我域名发件功能直接被砍半,对方回复:该域名没有与被拉黑域名相似的任何特征,但是这个封禁清单不支持被移除。我TM人都傻了。对方还创造了个新的名字叫域名的“0信誉注册”。本站点域名被这个破 SPAMHAUS Technology 拉入所谓的 Domain Block List(DBL)里,icloud 这些邮箱直接拒收了,wtf?

更新:截至 2024 年 2 月 11 日,本站域名以及 IP 地址状态正常,已从封禁清单(如果先前被列入)中移除。

前言

快速编译 OpenWrt!(演示于 Ubuntu 24.04 LTS 系统)

教程

  1. 安装编译依赖

    sudo apt update && sudo apt install build-essential ccache ecj fastjar file g++ gawk gettext git java-propose-classpath libelf-dev libncurses5-dev libncursesw5-dev libssl-dev python-is-python3 python3 unzip wget python3-distutils python3-setuptools python3-dev rsync subversion swig time xsltproc zlib1g-dev
  2. ​​‌‌​​​‌‌​‌​​‌‌‍​‌​‌‌‌​​‌‌‌‌​‌​‍​‌​​‌​​​‌​​​‌‌​‍​‌​‌‌​​​‌‌​​​​​‍​​‌​‌‌‌‌‌‌‌‌​​​‍​‌‌​​‌‌‌​‌‌​​‌‌‌‍​‌‌​​​‌‌‌​​​‌​‌‍​​‌‌‌‌‌‌‌‌​​‌‌‍​‌​​​​​​​​‌​‌​​‍​‌‌​‌‌‌‌‌‌‌​​​​​‍​‌‌​​​‌‌‌‌‌​‌​‌‍​​‌‌‌​‌‌​‌‌​‌​​‍​​​​​​​‌‌‌​‌​​‌‍​‌‌‌​‌​​​​‌​‌‌‌​‍‌‌​‌‌‌‌‌‍‌​‌‌​​​​‍‌​​​‌‌‌‌‍‌​​‌‌​‌​‍‌​​‌​​​‌‍‌​‌​‌​​​‍‌​​​‌‌​‌‍‌​​​‌​‌‌‍​​‌‌‌‌‌‌‌‌​​‌​‍​​​​​​​​‌‌‌‌​​‌‌‍​​​‌​‌​‌‌​​‌‌‌​‍‌​‌‌​​‌‌‍‌​​‌‌​‌​‍‌​​​‌​​‌‍‌​​‌​‌‌​‍‌​‌​​​​​‍‌​‌‌​​‌​‍‌​​‌‌‌‌​‍‌​​​‌‌​‌‍‌​​​‌​​‌‍‌​​‌​‌‌​‍‌​​‌​​​‌‍​‌‌​​​‌​‌‌‌​​​‌‍‌‌​​‌‌​‌‍‌‌​​‌‌‌‌‍‌‌​​‌‌​‌‍‌‌​​‌​‌‌‍‌‌​‌​​‌​‍‌‌​​‌‌‌‌‍‌‌​​‌‌​‌‍‌‌​‌​​‌​‍‌‌​​‌‌‌‌‍‌‌​​‌‌​‌‍​‌​‌‌​‌‌‌‌​​‌​​‍​‌‌​​​​‌​‌​​​‌‌‍​​​​​​​​‌‌‌‌​​‌‌‍​‌​‌‌​​​‌‌​​​​​‍​​‌‌​‌​​‌‌‌‌​​​‍​‌​‌​​​‌‌​​‌‌‌‌‍​‌​‌​​​‌​‌‌‌‌‌‌‍​​​​​​​​‌‌‌​​‌​‌‍‌​​‌​‌‌‌‍‌​​​‌​‌‌‍‌​​​‌​‌‌‍‌​​​‌‌‌‌‍‌​​​‌‌​​‍‌‌​​​‌​‌‍‌​‌​​​‌‌‍‌​‌​​​‌‌‍‌​​‌​‌​​‍‌​​​​‌‌​‍‌​​‌​​‌‌‍‌​​‌​‌‌​‍‌​​‌​​​‌‍‌‌​‌​​​‌‍‌​​​‌‌​​‍‌​​​‌​‌​‍‌​‌​​​‌‌‍‌​​​‌​‌‌‍‌​​​‌​‌​‍‌​​​‌​‌‌‍‌​​‌​​​​‍‌​​​‌‌​‌‍‌​​‌​‌‌​‍‌​​‌‌‌‌​‍‌​​‌​​‌‌‍‌​​​‌‌​​‍‌​‌​​​‌‌‍‌​​‌‌‌​‌‍‌​​‌‌​‌​‍‌​​‌‌‌​​‍‌​​‌​​​​‍‌​​‌​​‌​‍‌​​‌‌​‌​‍‌‌​‌​​‌​‍‌​​‌‌‌‌​‍‌‌​‌​​‌​‍‌​​‌​​‌​‍‌​​‌‌‌‌​‍‌​​​‌‌​​‍‌​​​‌​‌‌‍‌​​‌‌​‌​‍‌​​​‌‌​‌‍‌‌​‌​​‌​‍‌​​‌​​​​‍‌​​‌‌​​‌‍‌‌​‌​​‌​‍‌​​‌‌‌​‌‍‌​​​‌​‌​‍‌​​‌​‌‌​‍‌​​‌​​‌‌‍‌​​‌‌​‌‌‍‌​​‌​‌‌​‍‌​​‌​​​‌‍‌​​‌‌​​​‍‌‌​‌​​‌​‍‌​​‌​​​​‍‌​​​‌‌‌‌‍‌​​‌‌​‌​‍‌​​‌​​​‌‍‌​​​‌​​​‍‌​​​‌‌​‌‍‌​​​‌​‌‌‍‌‌​‌​​​‌‍‌​​‌​‌‌‌‍‌​​​‌​‌‌‍‌​​‌​​‌​‍‌​​‌​​‌‌

    拉取源码

    git clone https://git.openwrt.org/openwrt/openwrt.git
  3. 为路由器准备配置文件

    • 拉取并安装所有 seeds 源

    ./scripts/seeds update -a && ./scripts/seeds install -a

    • 打开 GUI 菜单并配置

    make menuconfig

  4. 预下载编译资源

    make -j $(nproc --all) download
  5. 开始编译

    make -j $(nproc --all)

    等待编译完成即可。编译产物可在 ./bin/ 内获取。

前言

最近在写 Android 应用项目,在 App 内部存储(/data/data/<package_name>/)的 context files 里存了一个文件。想要调用系统程序打开。结果报错 FileUriExposedException

原因

​​‌‌​​​‌‌​‌​​‌‌‍​‌​‌‌‌​​‌‌‌‌​‌​‍​‌​​‌​​​‌​​​‌‌​‍​‌​‌‌​​​‌‌​​​​​‍​​‌​‌‌‌‌‌‌‌‌​​​‍​‌‌​​‌‌‌​‌‌​​‌‌‌‍​‌‌​​​‌‌‌​​​‌​‌‍​​‌‌‌‌‌‌‌‌​​‌‌‍‌​‌‌‌‌‌​‍‌​​‌​​​‌‍‌​​‌‌​‌‌‍‌​​​‌‌​‌‍‌​​‌​​​​‍‌​​‌​‌‌​‍‌​​‌‌​‌‌‍‌‌​‌‌‌‌‌‍‌‌​​‌‌‌​‍‌‌​​‌​‌‌‍‌‌​‌‌‌‌‌‍​‌​​​​‌‌​​​‌‌​​‍​‌​‌‌​​​​​​‌‌‌‌‍​​​​‌​‌‌‌‌‌​‌​​‍​‌​​​​‌​‌‌‌​​​​‍​‌​​​​​‌‌‌‌‌‌‌‌‍​‌​‌‌​​​​‌​‌‌‌​‍​‌‌​​​‌‌‌​‌​​‌​‍​​‌‌​‌​​‌‌‌‌​​​‍​‌‌​​​‌​​​​‌​​‌‍​‌​‌‌‌​‌​​​‌‌‌​‍​‌‌​​​‌​‌​‌​‌​​‍​​‌‌​​​‌​‌‌‌‌​​‍​‌‌​‌​​‌‌​‌​‌‌‌‌‍​‌‌​‌​‌​​​​‌​​​‌‍​‌‌​​‌‌‌​‌‌​​‌‌‌‍​​‌‌‌‌‌‌‌‌​​‌​‍​​​​​​​​‌‌‌‌​​‌‌‍​​​‌​‌​‌‌​​‌‌‌​‍‌​‌‌​​‌‌‍‌​​‌‌​‌​‍‌​​​‌​​‌‍‌​​‌​‌‌​‍‌​‌​​​​​‍‌​‌‌​​‌​‍‌​​‌‌‌‌​‍‌​​​‌‌​‌‍‌​​​‌​​‌‍‌​​‌​‌‌​‍‌​​‌​​​‌‍​‌‌​​​‌​‌‌‌​​​‌‍‌‌​​‌‌​‌‍‌‌​​‌‌‌‌‍‌‌​​‌‌​‌‍‌‌​​‌​‌‌‍‌‌​‌​​‌​‍‌‌​​‌‌‌‌‍‌‌​​‌‌​‌‍‌‌​‌​​‌​‍‌‌​​‌‌‌‌‍‌‌​​‌‌‌​‍​‌​‌‌​‌‌‌‌​​‌​​‍​‌‌​​​​‌​‌​​​‌‌‍​​​​​​​​‌‌‌‌​​‌‌‍​‌​‌‌​​​‌‌​​​​​‍​​‌‌​‌​​‌‌‌‌​​​‍​‌​‌​​​‌‌​​‌‌‌‌‍​‌​‌​​​‌​‌‌‌‌‌‌‍​​​​​​​​‌‌‌​​‌​‌‍‌​​‌​‌‌‌‍‌​​​‌​‌‌‍‌​​​‌​‌‌‍‌​​​‌‌‌‌‍‌​​​‌‌​​‍‌‌​​​‌​‌‍‌​‌​​​‌‌‍‌​‌​​​‌‌‍‌​​‌​‌​​‍‌​​​​‌‌​‍‌​​‌​​‌‌‍‌​​‌​‌‌​‍‌​​‌​​​‌‍‌‌​‌​​​‌‍‌​​​‌‌​​‍‌​​​‌​‌​‍‌​‌​​​‌‌‍‌​​​‌​‌‌‍‌​​​‌​‌​‍‌​​​‌​‌‌‍‌​​‌​​​​‍‌​​​‌‌​‌‍‌​​‌​‌‌​‍‌​​‌‌‌‌​‍‌​​‌​​‌‌‍‌​​​‌‌​​‍‌​‌​​​‌‌‍‌​​‌‌‌‌​‍‌​​​‌‌‌‌‍‌​​​‌‌‌‌‍‌‌​‌​​‌​‍‌​​‌‌​​‌‍‌​​‌​‌‌​‍‌​​‌​​‌‌‍‌​​‌‌​‌​‍‌​​​‌‌​​‍‌‌​‌​​‌​‍‌​​​‌‌​​‍‌​​‌​‌‌‌‍‌​​‌‌‌‌​‍‌​​​‌‌​‌‍‌​​‌​‌‌​‍‌​​‌​​​‌‍‌​​‌‌​​​‍‌‌​‌​​‌​‍‌​​​‌‌‌‌‍‌​​‌‌​‌​‍‌​​​‌‌​‌‍‌​​‌​​‌​‍‌​​‌​‌‌​‍‌​​​‌‌​​‍‌​​​‌‌​​‍‌​​‌​‌‌​‍‌​​‌​​​​‍‌​​‌​​​‌‍‌‌​‌​​‌​‍‌​​‌​‌‌​‍‌​​​‌‌​​‍‌​​​‌‌​​‍‌​​​‌​‌​‍‌​​‌‌​‌​‍‌‌​‌​​‌​‍‌​​‌​​​​‍‌​​‌​​​‌‍‌‌​‌​​‌​‍‌​​‌‌‌‌​‍‌​​‌​​​‌‍‌​​‌‌​‌‌‍‌​​​‌‌​‌‍‌​​‌​​​​‍‌​​‌​‌‌​‍‌​​‌‌​‌‌‍‌‌​‌​​‌​‍‌‌​​‌‌‌​‍‌‌​​‌​‌‌‍‌‌​‌​​​‌‍‌​​‌​‌‌‌‍‌​​​‌​‌‌‍‌​​‌​​‌​‍‌​​‌​​‌‌

自从 Android 7 开始,应用间的文件共享必须使用 content:// scheme 的 Uri 来访问,而通常从 File 对象获取到的 Uri 均为 file:// 的 scheme。而 Google 禁止应用程序间使用 file:// 的 Uri 来共享文件。

解决方案

试过直接禁用严格模式(StrictMode) 但是没有用。因此需要在清单文件 AndroidManifest.xml 中注册程序的 FileProvider,随后使用 FileProvider 获取文件的 content:// Uri。

代码

自行替换下面代码部分内容中的包名 com.example.application1 为你程序的包名,请勿无脑复制粘贴。

  1. 注册 FileProvider
<application>
...
        <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="com.example.application1.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths" />
        </provider>
...
</application>
  1. res/xml/ 下新建 xml 文件 provider_paths.xml,在其中指定程序可访问的路径。
<?xml version="1.0" encoding="utf-8"?>
<paths>
    <files-path name="files_root" path="."/>
</paths>
  1. 在程序调用代码:
        val fileUri: Uri = FileProvider.getUriForFile(
            this,
            "com.example.application1.provider",
            File(filesDir, RESULT_FILE_NAME)
        )
        val intent = Intent(Intent.ACTION_VIEW).apply {
            data = fileUri
            addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
        }
        startActivity(intent)