乱码三千 – 分享实用IT技术

乱码三千 – 码出一个新世界


  • 首页

  • 归档

  • 搜索

使用Hugo搭建个人博客

发表于 2022-09-01

简介

Hugo和Hexo类似, 也是一个搭建静态博客的工具, Hugo由Go语言编写,相比之下 Hugo编译速度要比Hexo快很多

不过各有各的优点, 目前我两个工具都在用, 主要还是以Hexo为主

接下来介绍Hugo的使用

工具安装

  1. Mac用户

    1
    brew install hugo
  2. Windows用户

    GitHub下载安装包

    下载完后 给hugo.exe配置环境变量, 方便任意目录使用该程序

安装完后 可以在命令窗口输入hugo version 来检测是否安装成功

工具基础使用

  1. 创建博客空工程

    1
    hugo new site 项目名称

    执行完后会在当前目录下生成工程文件夹:

    image-20220901170044828

    目录介绍:

    • content目录: 用于存放博客文章
    • themes目录: 用于存放博客主题
    • static目录: 该目录下文件不会被渲染 可用于存放静态资源 比如图片js css以及CNAME等等
    • archetypes目录:里面存放文章模版文件
    • data目录:用于存放数据
    • layouts目录:用于存放布局文件
    • config.toml文件: 配置文件
  2. 新建文章

    1
    hugo new post/first.md
  3. 下载博客主题

    博客必须要有一个主题 不然渲染出来的页面是空白, 我们以hyde主题为例:

    1
    2
    3
    # 创建 themes 目录
    $ cd themes
    $ git clone https://github.com/spf13/hyde.git
  4. 生成静态文件

    需要指定以那个主题进行静态页面渲染

    1
    hugo --theme=hyde

    此时目录下会自动生成一个public目录, 里面的文件即为生成的静态文件, 可以直接部署到网站

  5. 部署到GitHub

    添加静态仓库关联:

    1
    2
    3
    $ cd public
    $ git init
    $ git remote add origin https://github.com/xxx/xxx.github.io.git

    或者使用submodule的方式:

    1
    git submodule add -f -b master https://github.com/xxx/xxx.github.io.git public

    最后将静态文件推送到仓库:

    1
    2
    3
    4

    $ git add -A
    $ git commit -m "first commit"
    $ git push -u origin master

    部署这一块 相比hexo要繁琐一些, 我们可以使用脚本或者用GitHub actions自动部署

其他命令

  1. 生成独立页面

    1
    hugo new about.md
  2. 博客本地调试

    调试时同样需要指定一个主题

    1
    hugo server --theme=hyde

    服务启动后 浏览器里打开: http://localhost:1313, 即可看到当前博客页面, 修改文章动态更新

    如果需要让草稿一并加入调试 那么可以加入-D:

    1
    hugo server --theme=hyde -D
  3. 生成静态文件时草稿也进行渲染

    1
    hugo  --theme=hyde -D

    必须是大写的D

进阶使用

  1. 每次执行指令都要指定主题太过繁琐? 没事 我们在配置文件中添加以下代码 配置默认主题即可解决烦恼

    1
    2
    # 主题名称
    theme = "hyde"

    image-20220901174231361

  2. 自定义域名无法访问?

    1. 需要在配置文件中将baseURL参数替换成你的域名
    2. 同时在static目录下新建CNAME文件, 然后输入你的域名

本文为作者原创转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

虚幻蓝图快速上手

发表于 2022-08-29

前言

蓝图 实际上也是一门编程语言 一种图形化的语言

使用蓝图 可以使开发者们省去代码的编写 即便你不会代码 也能进行游戏开发

这一点 很大程度地吸引了许许多多的游戏爱好者的加入

……

如果你有编程基础的话 那么蓝图上手会非常的快, 接下来 我们来快速入门

语言类比

我们知道 正常的编程的语言 基本上都有变量 函数的概念, 蓝图既然是一门语言, 那么它自然也有 只不过表现形式不太一样罢了

函数

  1. 蓝图中函数的表现形式

    在蓝图中 每一个蓝图节点我们可以视作一个函数

    image-20220829152437687

  2. 函数的定义

    虚幻引擎给我们封装好了许多函数 比如打印字符串的函数 给物体添加材质的函数等等

    如果我们想要自定义一个函数呢, 那么直接在左侧面板中添加一个新函数, 比如 我定义一个名为Test的函数 内部逻辑是比较传入的值是否等于3

    image-20220829180025489

    函数创建好后可以在蓝图事件表中通过鼠标右键进行名称搜索使用:

    image-20220829180313058

    image-20220829180354133

  3. 函数的调用

    节点连线可以表示函数调用和传参, 这种箭头形状的输入口 表示的就是函数调用, 左边调用右边

    image-20220829152624719

  4. 函数传参

    蓝图节点左侧下方的一系列入口 可以理解为函数参数的传递入口:

    image-20220829170225676

事件监听

现代程序的编写几乎离不开监听回调, 在设计模式的领域中也叫做观察者者模式, 我们可以在蓝图编辑面板中左侧查看当前创建事件:

image-20220919152646963

事件主要用于蓝图类之间的信息交互, 当关卡中的某一个子物体需要和所处关卡进行通信时, 我们可以在关卡蓝图中自定义一个事件, 然后子物体蓝图中调用触发:

image-20220919153104557

image-20220919153620945

事件触发命令格式为: ce 事件名

关卡蓝图是当前关卡内所有物体的父级 它可以获取到物体的实例 很容易和子物体进行数据通信, 但是物体并不持有关卡的实例, 所以信息交互需要依靠事件

变量

  1. 定义全局变量

    添加变量后 我们可以在属性细节面板中 设置变量的数据类型

    image-20220829153316870

  2. 定义局部变量

    在左侧面板中 点击鼠标右键调出菜单 可以增加局部变量的设置入口, 其操作和使用与全局变量一样 这里不再赘述

    image-20220829155333576

  3. 初始化变量的值

    通常情况下 我们在定义变量的同时 会对该变量进行值的初始化

    image-20220829153622095

  4. 获取变量值

    程序运行时 我们需要动态读取变量的值, 此时我们按住Ctrl键 然后鼠标左键将变量拖拽至事件图标中

    getvar

    此时会生成一个获取变量值的函数(蓝图节点)

  5. 设置变量的值

    同样的 我们要生成一个设置变量值的函数时, 按住Alt键 然后鼠标左键将变量拖拽至事件图标中即可

    setvar

注释

任何一门编程语言都有注释 方便我们对于程序的维护 蓝图自然也有

选中你需要进行注释的蓝图节点 然后按键盘C 则会出现一个方块将选中的节点包裹 此时可以输入注释内容

image-20220829153005361

逻辑执行

比如我们要执行一个在屏幕上打印字符串的逻辑, 那么我们可以在游戏启动的时候 调用打印字符串的函数(节点)

事件开始运行 这个函数 表示的就是游戏启动的 相当于Java中的main函数, 只执行一次

image-20220829160253326

编写好逻辑后 运行游戏 就能看到屏幕上打印的内容了

printString

对象

蓝图是一门面向对象的编程语言 在游戏中每一个物体都是一个对象

  1. 创建对象

    在世界大纲中显示的所有物体都是对象

    image-20220829161621529

    而创建对象方法很简单就是直接将素材拖拽至场景中

    2022-08-29 16-32-03.2022-08-29 16_34_17

    有些素材拖入场景后世界大纲中找不到 比如材质 说明该素材在蓝图事件表中不能直接通过右键的方式来创建对象引用

    材质比较特殊 对硬件资源消耗比较大 我们通常会在材质基础上创建材质实例 其好处是一方面减少资源消耗 另一方面可以暴露参数在游戏过程中动态修改属性

    对于材质对象的创建 我们可以选中对应材质 然后鼠标右键创建材质实例:

    image-20220829170844561

    点击创建后 素材面板会多出一个材质实例, 这个实例是材质的子类:

    image-20220829171302287

    我们可以在蓝图中创建数组变量来存放该实例:

    image-20220829173504954

  2. 获取对象实例

    我们只需在场景或者世界大纲中选中需要引用的物体对象, 然后在蓝图事件表中 右键创建对象引用节点即可

    image-20220829164655130

    动图操作如下:

    2022-08-29 16-48-00.2022-08-29 16_49_34

  3. 修改对象属性

    比如修改某个物体的位置属性, 我们可以在游戏启动时调用位置修改函数

    image-20220829165958763

关卡蓝图和蓝图类

  • 关卡蓝图: 重点在关卡 而不是蓝图 是指以蓝图语言编辑的关卡
  • 蓝图类: 重点在类 是指以蓝图语言定义和编辑的类

在游戏引擎中 关卡本质就是一个集合了众多Actor的类

虚幻引擎类继承关系

1
2
3
4
5
6
7
        |--Actor--Pawn--Character
|
Object--|--PlayerController
|
|--Info--GameModeBase
|
|--ActorComponent--SceneComponent

开发文档参考

官方文档

本文为作者原创转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

虚幻引擎实用快捷键汇总

发表于 2022-08-28

场景相关

  1. 快速定位聚焦到某个物体

    1
    键盘F
  2. 使物体下落吸附至地面

    1
    键盘end
  3. 快速旋转地图

    1
    Alt+鼠标左键
  4. 快速缩放地图

    1
    Alt+鼠标右键
  1. 临时放大地图

    1
    C+鼠标任意键长按
  2. 临时缩小地图

    1
    Z+鼠标任意键长按
  3. 进入预览模式

    1
    Alt+P

蓝图相关

  1. 在蓝图面板获取变量值

    1
    Ctrl+鼠标左键拖动
  2. 在蓝图面板设置变量值

    1
    Alt+鼠标左键拖动
  3. 切断蓝图节点之间的连线

    1
    光标移至线上 然后 Alt+鼠标左键
  4. 给选中的蓝图节点添加注释

    1
    键盘C
  5. 克隆选中的蓝图节点

    1
     

本文为作者原创转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

关于虚幻引擎位置迁移之路径修改

发表于 2022-08-22

起因

最近换了硬盘 打算将原来的虚幻引擎迁移到另一块硬盘 但是当我将引擎文件拷贝过去后 虚幻启动程序并未识别 然而设置面板中又没有关于这一块路径的修改

难道我得重新下载一遍? 这我肯定是不能接受的呀

于是乎我百度了一番经过尝试之后发现一个方法可行

解决方案一

重新下载引擎 然后选择新的引擎下载路径 该路径是你新硬盘位置

image-20220822145537993

下载开始后硬盘中会自动生成相应的引擎目录 此时暂停下载 紧接着将旧引擎迁移至该目录下 最后重启Epic Games Launcher即可

解决方案二

进入虚幻support目录 修改install.in文件, Mac系统路径如下:

1
/Users/你的用户名/Library/Application Support/Epic/UnrealEngine/install.in

用文本文件打开 然后修改对应的路径即可

image-20220822150921510

同样的 最后重启Epic Games Launcher即可

本文为作者原创转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

Youtube的山寨版LibreTube国内直连

发表于 2022-08-03

前言

发现一款软件 - LibreTube,看这名字就知道八成是 Youtube 的山寨版。

请忽略google的渣翻译

打开 APP 后长这样,直接访问无压力:

界面设计的看起来还是不错的,视频刚打开需要多缓冲几秒。

左上角的设置里还可以设置不同国家和视频源,默认分辨率等。速度慢可以在【选择实例】里切换其他的\实例*。*

搜索功能也同样好用,经过小编测试,动漫新番,包括最近比较火的电视剧都能搜到,关键还都是正版。

视频播放器还自带字幕,变速功能。这么多年过去了,神仙姐姐依旧那么好看

另外还可以把喜欢的视频下载下来,订阅喜欢的频道,非常方便。

APP 是免费开源的,安装包只有 13.7MB,不得不说,开源牛逼,开源万岁。

由于直接从 Github 下载太慢,小编已经将 apk 安装包上传到了网盘。

最后附上下载地址:

  • GitHub: 点击下载

  • 蓝奏网盘: 点击下载

本文转载自:微信公众号

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

一款好用的搜索引擎推荐

发表于 2022-08-02

前言

周围不少小伙伴反应,最近搜索引擎的准确率越来越低了,有时候搜索官网都搜不到。

之前介绍过号称 “国内版 Google” 的F搜,前不久还由于各种原因无法访问了。

今天一看发现,又回归了,域名也由 fsou.cc换成了 fsoufsou.com。界面也和Google 搜索越来越像了。

不过今天的重点不在这里,最近发现个超级牛的搜索引擎。

网站走的简洁风格,但功能可不简单。汇聚了来自 Google,Bing 等70多个不同搜索引擎的结果。

除了常规的网页和图片搜索,还支持视频,新闻,音乐,学术,文件,社交媒体等。

还可以在首选项里设置里对不同标签开启不同的搜索引擎。比如常规类中只开启了Google,还可以开启Bing,duckduckgo 等搜索结果。

开启后你会发现搜索结果准确率又进一步提高。这个搜索引擎目前是开源的,人人都可以搭建。

不过,已经有很多大神已经搭建好了,镜像站点非常多,就没必要自己动手了。

只需要在 https://searx.space 选择一个最快的站点就能访问了。

通过这个搜索工具 可以搜到平常搜不到的东西 大家懂得

本文转载自:微信公众号

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

一款跨平台的m3u8视频下载工具

发表于 2022-08-02

介绍

M3U8-Downloader是基于Electron框架开发的一款可以下载、播放HLS视频流的APP。

功能 支持
HLS标准源 ✓
标准 AES-128-CBC加密 ✓
标准 AES-196-CBC加密 ✓
标准 AES-256-CBC加密 ✓
非标准 AES-*-CBC加密 ㄨ

开放源码 M3U8-Downloader

GitHub stars

下载最新版 2.0.7 (2022-01-26)

百度网盘下载
1
链接:https://pan.baidu.com/s/14zaMkxgfTC0HSge-Ze6EpQ 提取码:m3u8
阿里云盘下载
1
链接:https://www.aliyundrive.com/s/1QjQvn29W6J

使用展示

M3U8-Downloader 下载展示
M3U8-Downloader 合并展示
M3U8-Downloader 修复合并展示

HLS源怎么抓取呢?

在chrome浏览器打开视频网页,按下F12,页签点击到Network页面,在Filter框里输入”m3u8”,然后按F5刷新页面,如果网页里的视频使用的是HLS源,就可以在这里捕获到视频流地址,然后选中右键 Copy -> Copy Link Address.

M3U8-Downloader 可以使用您提供m3u8源地址下载并无损转码Mp4文件。

关于 M3U8-Downloader

点击进入官网

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

下载视频m3u8格式视频的若干种方法

发表于 2022-08-01

第一种方法 使用ffmpeg工具

先安装ffmpeg:

brew install ffmpeg

img

ffmpeg安装完成

ffmpeg使用:通过检查元素,元素定位,可以看到某视频地址的资源地址如下blob:URL的这种形式

img

然后通过查看Network,找到blob:URL地址背后的m3u8地址

img

用ffmpeg下载视频,并将m3u8格式转为mp4格式,指令如下

ffmpeg -i https://youku.com-youku.net/20180620/13336_33db73a9/index.m3u8 fileName.mp4

或

ffmpeg -i https://youku.com-youku.net/20180620/13336_33db73a9/index.m3u8 -c copy fileName.mp4

img

如上下载中

由于视频很大,下载需要很长长长时间(1个G的视频可能需下载几小时…)。

可以通过如下指令进行下载提速(下载速度大约能提升到几到十几分钟,很棒了哦,起码比百度云快):

ffmpeg -i https://youku.com-youku.net/20180620/13336_33db73a9/index.m3u8 -c copy -bsf:a aac_adtstoasc fileName.mp4

如果你想用终端工具拉起视频播放,直接通过如下指令就能 播放某链接的视频

ffplay -i https://youku.com-youku.net/20180620/13336_33db73a9/index.m3u8

img

下载完成,播放中

第二种方法 使用Chrome插件Tampermonkey(油猴)

关于Tampermonkey油猴的安装和基本使用,见我之前的一篇文章:

晒一下我常用的几款chrome 插件,你值得拥有

这里介绍油猴中1个好用的脚本:media-source-extract

在油猴脚本列表中暂时无法提供下载,目前需要手动创建安装,具体的视频下载和工具使用,见链接:

点击进入下载

media-source-extract是一款提取视频画面和音频的工具,最终下载得到的是音频文件和视频画面文件。

因此可以通过合并音视频来完成最终的视频。

具体音视频合成方法网上有很多,我这边提供一套ffmpeg的合并方法,具体分2步走:

1、先把音频「audio_mp4」(或多个「audio_mp4」) 进行合并转码,转为.aac格式:命令行执行如下:

1
ffmpeg -i "***-audio_mp4;codecs=***.mp4" -acodec copy "audio.aac"

(记得命令行先切换到音频所在的文件路径下)

2、再将原始视频「video_mp4」(或多个「video_mp4」),和上一步得到的 aac 「audio.aac」组装到一起,命令行执行如下:

1
ffmpeg -i "***-video_mp4;codecs=***.mp4" -i "audio.aac" -c copy -shortest "result.mp4"

(记得命令行先切换到音频所在的文件路径下)

最终result.mp4就是你要的合并了音频和画面的视频了!

media-source-extract这种提取音视频合并的方法,太麻烦了,有点像录屏的感觉。

下载操作的复杂度,以及过程可能会丢失的视频片段,我表示很淦。

但是作为一个下载方式,有价值,可作为备胎。

再介绍1个比较好油猴插件:m3u8-downloader

在油猴脚本地址栏 用户脚本 中去搜索下载安装,如下图:

img

img

使用:譬如下载一部烂片 动作片《蛇蝎情人2003正片》免费在线播放-星空影院,用google浏览器输入该视频网址,m3u8-downloader 脚本会自动识别blob:URL地址并拿到m3u8文件,如下:

img

点击“跳转下载”,会跳转到下载页面

img

选择“原格式下载”或“转码为MP4下载”

img

开始下载,同时可以看到下载进度,如下:

img

下载完成,本地播放,如图:

img

第三种方法 使用NeatDownloadManager Extension

这是一款我常用的插件,很好用。

可以去下载1个PC端软件 和 google插件

PC端NeatDownloadManager下载地址:Neat Download Manager for Mac and Windows (Free Internet Download Manager Mac & Windows )

安装后,界面如下

img

在红色标记1的Setting中,可以设置对应代理,譬如常见的某d下载提速,可以像这样设置:

img

红色标记2的Browsers中,点击“Add Chrome Extension”就可以给google浏览器添加该插件啦:

img

当然也可以直接在google插件搜索 NeatDownloadManager Extension(需要f墙),进行安装:

img

安装已经完成啦:

img

NeatDownloadManager Extension插件的使用:

我想下载温老的视频:温铁军:四大文明古国为何只有中国没有灭亡?罗马的民主只对其10%的人口?【温铁军践闻录5-35】_哔哩哔哩_bilibili

在google浏览器里,打开该地址,就可以看到该插件拿到的视频资源:

img

点击那个size最大的视频资源,就会自动下载了:

img

下载完成

img

搞定!

第四种方法 使用视频下载器 - CoCoCut

在google网上应用商店(需要f墙),搜索“视频下载器 - CoCoCut”

img

安装该插件:

img

视频下载器 - CoCoCut使用:

譬如我想下载一个电影,我在goolge 浏览器上随便找了一个电影网站:《战狼2》高清完整版_最新电影_免费在线观看平台_猪蹄影院 ,然后该插件就会自动检测到该视频信息,点开该插件,就可以看到并执行下载了

img

下载中

img

下载完成。

img


最后,推荐几款我常用的解析.m3u8的在线网站:

FLVCD - 硕鼠官网|FLV下载|视频下载

Gihosoft TubeGet

真心希望,更多的技术为更多人使用。

本文转载自:知乎

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

ANDROID跳转到手机自启动管理页面

发表于 2022-07-21

前言

有时候,为了确保APP的后台正常运行,需要让用户去设置打开APP的自启动权限(或者改为手动管理/huawei)。为了更好的用户体验,在APP中可以直接跳转到手机的自启动管理页面或者权限管理页面。


应用启动管理页面

oppo/vivo是没有这个页面的
华为

  • 华为
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
ComponentName componentName = null;
int sdkVersion = Build.VERSION.SDK_INT;
try {
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//跳自启动管理
if (sdkVersion >= 28){//9:已测试
componentName = ComponentName.unflattenFromString("com.huawei.systemmanager/.startupmgr.ui.StartupNormalAppListActivity");//跳自启动管理
}else if (sdkVersion >= 26){//8:已测试
componentName = ComponentName.unflattenFromString("com.huawei.systemmanager/.appcontrol.activity.StartupAppControlActivity");
}else if (sdkVersion >= 23){//7.6:已测试
componentName = ComponentName.unflattenFromString("com.huawei.systemmanager/.startupmgr.ui.StartupNormalAppListActivity");
}else if (sdkVersion >= 21){//5
componentName = ComponentName.unflattenFromString("com.huawei.systemmanager/com.huawei.permissionmanager.ui.MainActivity");
}
//componentName = new ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.optimize.process.ProtectActivity");//锁屏清理
intent.setComponent(componentName);
startActivity(intent);
}catch (Exception e){
//跳转失败
}
123456789101112131415161718192021
  • 小米
1
2
3
4
5
6
7
8
9
10
11
Intent intent = new Intent();
try {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
ComponentName componentName = null;
componentName = new ComponentName("com.miui.securitycenter", "com.miui.permcenter.autostart.AutoStartManagementActivity");
intent.setComponent(componentName);
context.startActivity(intent);
} catch (Exception e) {//抛出异常就直接打开设置页面
jumpAPPInfo(context);
}
12345678910
  • 三星
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Intent intent = new Intent();
ComponentName componentName = null;
try {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//跳自启动管理
componentName = ComponentName.unflattenFromString("com.samsung.android.sm/.app.dashboard.SmartManagerDashBoardActivity");
intent.setComponent(componentName);
startActivity(intent);
}catch (Exception e){
try {
componentName = new ComponentName("com.samsung.android.sm_cn", "com.samsung.android.sm.ui.ram.AutoRunActivity");
intent.setComponent(componentName);
startActivity(intent);
}catch (Exception e1){
//跳转失败
}
}
1234567891011121314151617
  • 魅族
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Intent intent = new Intent();
ComponentName componentName = null;
try {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//跳自启动管理
componentName = ComponentName.unflattenFromString("com.meizu.safe/.permission.SmartBGActivity");//跳转到后台管理页面
intent.setComponent(componentName);
startActivity(intent);
}catch (Exception e){
try {
componentName = ComponentName.unflattenFromString("com.meizu.safe/.permission.PermissionMainActivity");//跳转到手机管家
intent.setComponent(componentName);
startActivity(intent);
}catch (Exception e1){
//跳转失败
}
}
1234567891011121314151617

权限管理页面

这个页面重要的权限自启动、锁屏显示、后台弹出界面

vivo

  • vivo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Intent localIntent;
try {
if (((Build.MODEL.contains("Y85")) && (!Build.MODEL.contains("Y85A"))) || (Build.MODEL.contains("vivo Y53L"))) {
localIntent = new Intent();
localIntent.setClassName("com.vivo.permissionmanager", "com.vivo.permissionmanager.activity.PurviewTabActivity");
localIntent.putExtra("packagename", context.getPackageName());
localIntent.putExtra("tabId", "1");
context.startActivity(localIntent);
} else {
localIntent = new Intent();
localIntent.setClassName("com.vivo.permissionmanager", "com.vivo.permissionmanager.activity.SoftPermissionDetailActivity");
localIntent.setAction("secure.intent.action.softPermissionDetail");
localIntent.putExtra("packagename", context.getPackageName());
context.startActivity(localIntent);
}
}catch (Exception e){
// 否则跳转到应用详情
localIntent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", context.getPackageName(), null);
localIntent.setData(uri);
context.startActivity(localIntent);
}
12345678910111213141516171819202122
  • OPPO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Intent intent = new Intent();
try {
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("packageName", BuildConfig.APPLICATION_ID);
ComponentName comp = new ComponentName("com.color.safecenter", "com.color.safecenter.permission.PermissionManagerActivity");
intent.setComponent(comp);
startActivity(intent);
}catch (Exception e){
try {
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("pkg_name", context.getPackageName());
intent.putExtra("app_name", context.getString(R.string.app_name));
intent.putExtra("class_name", "com.welab.notificationdemo.MainActivity");
ComponentName comp = new ComponentName("com.coloros.notificationmanager", "com.coloros" +
".notificationmanager.AppDetailPreferenceActivity");
intent.setComponent(comp);
startActivity(intent);
}catch (Exception e1){
// 否则跳转到应用详情
intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", context.getPackageName(), null);
intent.setData(uri);
context.startActivity(intent);
}
}
12345678910111213141516171819202122232425
  • 小米
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
try {
// MIUI 8
Intent localIntent = new Intent("miui.intent.action.APP_PERM_EDITOR");
localIntent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.PermissionsEditorActivity");
localIntent.putExtra("extra_pkgname", context.getPackageName());
context.startActivity(localIntent);
} catch (Exception e) {
try {
// MIUI 5/6/7
Intent localIntent = new Intent("miui.intent.action.APP_PERM_EDITOR");
localIntent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.AppPermissionsEditorActivity");
localIntent.putExtra("extra_pkgname", context.getPackageName());
context.startActivity(localIntent);
} catch (Exception e1) {
// 否则跳转到应用详情
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", context.getPackageName(), null);
intent.setData(uri);
context.startActivity(intent);
}
}
123456789101112131415161718192021

应用详情页面

1
2
3
4
5
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", context.getPackageName(), null);
intent.setData(uri);
startActivity(intent);
1234

总结

在其他应用上层显示、后台弹出界面、锁屏显示这三个权限会直接影响APP从后台启动活动,详情可以了解另一篇文章–>Android 在后台无法启动Activity。

附加

vivo/oppo/小米手机有一个“后台弹出界面”权限, 华为是没有的, 可以使用以下代码来检测该权限是否开启:

1
2
3
4
5
6
7
8
9
10
11
12
13
private boolean isAllowed() {
AppOpsManager ops = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
try {
int op = 10021;
Method method = ops.getClass().getMethod("checkOpNoThrow", new Class[]{int.class, int.class, String.class});
Integer result = (Integer) method.invoke(ops, op, Process.myUid(), getPackageName());
return result == AppOpsManager.MODE_ALLOWED;

} catch (Exception e) {
Log.e(TAG, "not support");
}
return false;
}

本文转载自:https://www.freesion.com/article/7753459867/

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

Android代码跳转至电池优化电池信息界面

发表于 2022-07-21

前言

最近有一款产品有后台保活需求, 无奈甲方太穷, 厂商白名单什么的是别想了, 只能采用原始粗暴的方法, 就是让用户手动开启各种权限, 至于用户体验 这个不存在的 顶多跳转到相关设置页面

其中有一项就是涉及到电池优化的, 禁止电池优化可以延长后台保活时间

以小米手机为例, 给大家列举几个电池相关页面的跳转代码

电池优化页面

页面图示:

1701658389765_.pic

代码如下:

1
2
3
startActivity(Intent().apply {
action = Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS
})

电池信息页面

页面图示:

1681658389761_.pic

代码如下:

1
2
3
4
startActivity(Intent("/").apply {
component = ComponentName("com.android.settings", "com.android.settings.BatteryInfo")
action = "android.intent.action.VIEW"
})

耗电统计页面

页面图示:

1691658389763_.pic

代码如下:

1
2
3
4
5
val powerUsageIntent = Intent(Intent.ACTION_POWER_USAGE_SUMMARY)
val resolveInfo: ResolveInfo? = requireActivity().packageManager.resolveActivity(powerUsageIntent, 0)
if (resolveInfo != null) {
startActivity(powerUsageIntent)
}

休眠时始终保持网络连接

华为手机有这个页面

Screenshot_20220721_171601_com.huawei.systemmanager

想要跳转到这个页面, 首先需要获取到该页面的包名和Activity全路径, 可以使用adb获取, 指令如下;

1
adb -s 设备名  shell dumpsys activity activities

运行结果如图:

image-20220721170255859

其中com.huawei.systemmanager表示包名 也就是applicationId, 而.power.ui.PowerSettingActivity表示Activity路径, 但最前面有个点 因此需要把包名加进去, 最后得到全路径是:

1
com.huawei.systemmanager.power.ui.PowerSettingActivity

有了包名和Activity路径, 那么直接上启动代码:

1
2
3
4
5
6
7
8
startActivity(Intent().apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK
putExtra("packageName", requireActivity().packageName)
component = ComponentName(
"com.huawei.systemmanager",
"com.huawei.systemmanager.power.ui.PowerSettingActivity"
)
})

最后运行报错. 提示没有权限:

1
java.lang.SecurityException: Permission Denial: starting Intent { flg=0x10000000 cmp=com.huawei.systemmanager/.power.ui.PowerSettingActivity (has extras) } from ProcessRecord{439cab1 15282:com.xxx.xxx/u0a211} (pid=15282, uid=10211) not exported from uid 1000

暂时没有找到解决方法, 以上只是一种思路, 仅供参考

本文为作者原创转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

1…131415…50

乱码三千

android程序员一枚,擅长java,kotlin,python,金融投资,欢迎交流~

491 日志
143 标签
RSS
© 2025 乱码三千
本站总访问量次
由 Hexo 强力驱动
|
主题 — NexT.Muse v5.1.4
0%