Android 10(Q) 以上普通 APP 隐藏应用图标问题探究及解决方案

1、实验环境

aosp 版本 10.0 系统
aosp 版本 13.0 系统

2、验证结果

2.1 方式一

APP AndroidManifest.xml 中通过 activity-alias 配置带 LAUNCHER 属性 category,并且 android:enabled=“true”

10.0 系统中可安装后正常显示 icon,通过 setComponentEnabledSetting 隐藏 icon 成功,桌面上不留下 app 相关任何图标

13.0 系统中可安装后正常显示 icon,通过 setComponentEnabledSetting 隐藏 icon 不成功,桌面上会留下透明占位 alias 图标

2.2 方式二

APP AndroidManifest.xml 中通过 activity-alias 配置带 LAUNCHER 属性 category,并且 android:enabled=“false”

10.0 系统中首次安装后直接不显示 icon,但通过 setComponentEnabledSetting 可控制隐藏 icon 成功,桌面上不留下 app 相关任何图标

13.0 系统中首次安装后直接不显示 icon,但通过 setComponentEnabledSetting 可控制隐藏 icon 成功,桌面上不留下 app 相关任何图标

3、展开讲讲

目前隐藏图标的思路几乎都是这样的,在 AndroidManifest.xml 中配置一些 activity-alias,然后通过

getPackageManager().setComponentEnabledSetting(new ComponentName(con,activityAliasName,PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP);

禁用(隐藏) activity-alias 组件

启用(显示) activity-alias 组件

在 10.0 以上高版本,谷歌加了补丁更新,导致此种方式不再适用。由这个值 show_hidden_icon_apps_enabled 控制

Settings.Global.putInt(getContentResolver(), “show_hidden_icon_apps_enabled”, 0);

经过验证,将 show_hidden_icon_apps_enabled 改为 0,高版本上即可延用之前方式隐藏图标。

但普通app是肯定改不了这个值的,没有权限 Permission denial: writing to settings requires:android.permission.WRITE_SECURE_SETTINGS

更多解释可查看

那些年的Android开发经验记录
Android应用之隐藏桌面图标的一种方法
android 动态修改dimens android动态修改图标和名称

4、测试代码

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"package="cn.test.hideicon"><permission android:name="android.permission.WRITE_SECURE_SETTINGS"/><applicationandroid:allowBackup="true"android:icon="@drawable/icon_transparent"android:label="@string/app_name"android:roundIcon="@drawable/ic_cloud"android:supportsRtl="true"android:theme="@style/AppTheme"><!--<activityandroid:name=".MainActivity"android:exported="true"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity>--><activityandroid:name="cn.test.hideicon.AliasMainActivity"android:exported="true"android:theme="@style/KeepLiveTheme"><!-- <intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /><dataandroid:host="MainActivity"android:scheme="com.learn.alias.target"tools:ignore="AppLinkUrlError" /></intent-filter>--><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.DEFAULT" /><category android:name="android.intent.category.BROWSABLE" /><category android:name="android.intent.category.TEST" /><category android:name="android.intent.category.LAUNCHER" /><category android:name="com.ksgzlf.djbwrpgk" /><data android:host="goapp.fromchrome" android:scheme="tgsoft" /></intent-filter></activity><!-- 外部要启动的Activity --><activityandroid:name="cn.test.hideicon.MainActivity"android:excludeFromRecents="true"android:exported="true"android:finishOnTaskLaunch="false"android:launchMode="singleInstance" /><activityandroid:name="cn.test.hideicon.AliasActivity"android:excludeFromRecents="true"android:exported="true"android:finishOnTaskLaunch="false"android:launchMode="singleInstance"android:theme="@style/TransparentStyle"><intent-filter><action android:name="android.intent.action.VIEW" /></intent-filter><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.DEFAULT" /><category android:name="android.intent.category.BROWSABLE" /><category android:name="android.intent.category.TEST" /><category android:name="android.intent.category.LAUNCHER" /><category android:name="com.ksgzlf.djbwrpgk" /><data android:host="goapp.fromchrome" android:scheme="tgsoft" /></intent-filter></activity><activity-aliasandroid:name="cn.test.hideicon.Alias1Activity"android:enabled="true"android:exported="true"android:icon="@drawable/ic_launcher_background"android:label="aaaa"android:launchMode="singleTask"android:roundIcon="@drawable/icon_transparent"android:targetActivity="cn.test.hideicon.MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.DEFAULT" />
<!--                <category android:name="android.intent.category.BROWSABLE" />-->
<!--                <category android:name="android.intent.category.TEST" />--><category android:name="android.intent.category.LAUNCHER" />
<!--                <category android:name="com.ksgzlf.djbwrpgk" />-->
<!--                <data android:host="goapp.fromchrome" android:scheme="tgsoft" />--></intent-filter></activity-alias><activity-aliasandroid:name="com.android.ui.ActivityAliasN"android:configChanges="keyboard|orientation|screenSize"android:enabled="false"android:exported="true"android:icon="@drawable/ic_launcher_background"android:label="bbbb"android:launchMode="singleTask"android:roundIcon="@drawable/icon_transparent"android:targetActivity="cn.test.hideicon.MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity-alias><activity-aliasandroid:name="com.android.ui.ActivityAlias5"android:configChanges="keyboard|orientation|screenSize"android:enabled="true"android:exported="true"android:icon="@drawable/icon_transparent"android:label="maygroup55555"android:launchMode="singleTask"android:roundIcon="@drawable/icon_transparent"android:targetActivity="cn.test.hideicon.MainActivity"><intent-filter tools:ignore="AppLinkUrlError"><action android:name="android.intent.action.CHOOSER" /><action android:name="android.intent.action.MAIN" /><action android:name="android.intent.action.VIEW" /><action android:name="android.intent.action.SEND" /><action android:name="android.intent.action.SEND_MULTIPLE" /><category android:name="android.intent.category.INFO" /><category android:name="android.intent.category.DEFAULT" /><category android:name="com.android.internal.category.PLATLOGO" /><category android:name="android.intent.category.BROWSABLE" /><action android:name="android.intent.action.PACKAGE_REMOVED" /><action android:name="android.intent.action.PACKAGE_REPLACED" /><action android:name="android.intent.action.PACKAGE_ADDED" /><action android:name="android.intent.action.PACKAGE_CHANGED" /><action android:name="com.ui.OnAlarmReceiver.ACTION_WIDGET_RECEIVER" /><action android:name="com.android.vending.billing.InAppBillingService.COIN" /><action android:name="com.android.vending.billing.InAppBillingService.COIO" /><action android:name="com.android.vending.billing.InAppBillingService.LUCM" /><action android:name="com.android.vending.billing.InAppBillingService.PROX" /><action android:name="ir.cafebazaar.pardakht.InAppBillingService.BIND" /><action android:name="ru.aaaaaaax.installer" /><action android:name="com.nokia.payment.iapenabler.InAppBillingService.BIND" /><action android:name="com.android.vending.billing.InAppBillingService.INST" /><action android:name="com.App.Reborn" /></intent-filter></activity-alias></application>
</manifest>

MainActivity.java

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//adb shell settings get global show_hidden_icon_apps_enabledtry {int showHidden = Settings.Global.getInt(getContentResolver(),"show_hidden_icon_apps_enabled", 1);Log.d("MainActivity", "showHidden: " + showHidden);if (showHidden != 0) {Settings.Global.putInt(getContentResolver(), "show_hidden_icon_apps_enabled", 0);Log.i("MainActivity", "set showHidden: ");}} catch (Exception e) {e.printStackTrace();}}public void show(View view) {String clazzName = "com.android.ui.ActivityAliasN";enableComponent(this, clazzName);enableComponent(this, "cn.test.hideicon.Alias1Activity");finish();}public void hide(View view) {String clazzName = "com.android.ui.ActivityAliasN";disableComponent(this, clazzName);disableComponent(this, "cn.test.hideicon.Alias1Activity");finish();}/*** 启动组件*/public static void enableComponent(Context context, String clazzName) {ComponentName componentName = new ComponentName(context, clazzName);PackageManager mPackageManager = context.getPackageManager();mPackageManager.setComponentEnabledSetting(componentName,PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);}/*** 禁用组件*/public static void disableComponent(Context context, String clazzName) {ComponentName componentName = new ComponentName(context, clazzName);PackageManager mPackageManager = context.getPackageManager();mPackageManager.setComponentEnabledSetting(componentName,PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);}}

AliasMainActivity.java

public class AliasMainActivity extends AppCompatActivity {private Button toActivity, hideActivity;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Window window = getWindow();window.setGravity(Gravity.LEFT | Gravity.TOP);WindowManager.LayoutParams params = window.getAttributes();params.x = 0;params.y = 0;params.width = 1;params.height = 1;window.setAttributes(params);finish();}}

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

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

相关文章

idea中run和debug是灰色的

【现象】idea中run和debug是灰色的 点击 旁边的Add Configuration…一看都是空白 【解决方法】&#xff1a; npm点开之后 【结果】

文本转图像 学习笔记

VQGAN (Vector Quantized Generative Adversarial Network) 是一种基于 GAN 的生成模型&#xff0c;可以将图像或文本转换为高质量的图像。 VQ &#xff08;Vector Quantization&#xff09;是一种数据压缩技术&#xff0c;是指将连续数据表示为离散化的向量。输入的图像或文本…

转换NC或HDF数据时候转出数据无坐标信息的处理方法

有时候我们在转换NC或HDF数据时&#xff0c;有时候会出现没有坐标信息的情况&#xff01;如下图&#xff1a; 这种情况一般是原始数据将坐标信息存储在说明文件中以便后期做生成坐标信息的处理、或坐标存储的形式比较特殊&#xff0c;造成工具无法读取&#xff01;这种数据处理…

Python迭代器与生成器研究记录

Python迭代器与生成器研究记录 前言 迭代器肯定是可迭代对象&#xff0c;但是可迭代对象不一定是迭代器&#xff0c;生成器一定是迭代器&#xff0c;但是迭代器不一定是生成器 生成器是特殊的迭代器&#xff0c;所以生成器一定是迭代器&#xff0c;迭代器一定是可迭代对象 我…

YOLOv8分割训练及分割半自动标注

YOLOv8是基于目标检测算法YOLOv5的改进版,它在YOLOv5的基础上进行了优化和改进,加入了一些新的特性和技术,如切片注意力机制、骨干网络的选择等。 本文以yolov8-seg为基准,主要整理分割训练流程及使用v8分割模型进行半自动标注的过程。 一、v8-seg训练 1.1 环境配置 github…

【Altera】平台设计器互连会回压 AXI 接口怎么办

说明 实现 AXI 接口的所有组件都具有发行或接受能力设置。每当互连检测到管理器&#xff08;主管理器&#xff09;发出的事务多于管理器的发行容量设置时&#xff0c;互连将通过断言 AxREADY 向管理器背压。每当互连检测到从属&#xff08;从站&#xff09;接收的事务多于从属的…

实用篇 | 一文快速构建人工智能前端展示streamlit应用

----------------------- &#x1f388;API 相关直达 &#x1f388;-------------------------- &#x1f680;Gradio: 实用篇 | 关于Gradio快速构建人工智能模型实现界面&#xff0c;你想知道的都在这里-CSDN博客 &#x1f680;Streamlit :实用篇 | 一文快速构建人工智能前端展…

Activity从下往上弹出视差效果实现

其实这篇文章是转至简书上的大佬的&#xff0c;加上我自己的代码实践了下发现可行&#xff0c;于是就分享下 先看效果 介绍: 其实有很多方法都可以实现这种效果&#xff0c;popwindow&#xff0c;Dialog&#xff0c;BottomSheetDialogFragment&#xff0c;BottomSheetDialog等…

Linux 安装 Gitea.md

### 从官网下载git 和 gitea Git下载地址: https://mirrors.edge.kernel.org/pub/software/scm/git/ 下载 git-2.43.0.tar.gz: https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.43.0.tar.gz Gitea下载地址: https://dl.gitea.com/gitea/ 下载 linux-arm64 的二进…

链表OJ—相交链表

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 1、相交链表的题目&#xff1a; 方法讲解&#xff1a; 图文解析&#xff1a; 代码实现&#xff1a; 总结 前言 世上有两种耀眼的光芒&#xff0c;一种是正在升…

15.Java程序设计-基于SSM框架的微信小程序校园求职系统的设计与实现

摘要&#xff1a; 本研究旨在设计并实现一款基于SSM框架的微信小程序校园求职系统&#xff0c;以提升校园求职流程的效率和便捷性。通过整合微信小程序平台和SSM框架的优势&#xff0c;本系统涵盖了用户管理、职位发布与搜索、简历管理、消息通知等多个功能模块&#xff0c;为…

爱智EdgerOS之深入解析AI图像引擎如何实现AI视觉开发

一、前言 AI 视觉是为了让计算机利用摄像机来替代人眼对目标进行识别&#xff0c;跟踪并进一步完成一些更加复杂的图像处理。这一领域的学术研究已经存在了很长时间&#xff0c;但直到 20 世纪 70 年代后期&#xff0c;当计算机的性能提高到足以处理图片这样大规模的数据时&am…

ArkUI组件

目录 一、概述 声明式UI 应用模型 二、常用组件 1、Image&#xff1a;图片展示组件 示例 配置控制授权申请 2、Text&#xff1a;文本显示组件 示例 3、TextInput&#xff1a;文本输入组件 示例 4、Button&#xff1a;按钮组件 5、Slider&#xff1a;滑动条组件 …

Swagger PHP Thinkphp 接口文档

安装 1. 安装依赖 composer require zircote/swagger-php 2. 下载Swagger UI git clone https://github.com/swagger-api/swagger-ui.git 3. 复制下载好的Swagger UI 中的dist目录到public目录中&#xff0c;修改目录名称 cp -rf swagger-ui/dist /home/htdocs/public/ m…

vue中设置滚动条的样式

在vue项目中&#xff0c;想要设置如下图中所示滚动条的样式&#xff0c;可以采用如下方式&#xff1a; ​// 直接写在vue.app文件中 ::-webkit-scrollbar {width: 3px;height: 3px; } ::-webkit-scrollbar-thumb { //滑块部分// border-radius: 5px;background-color: #1890ff;…

【智能家居】智能家居项目

智能家居项目目录 项目目录结构 完整而典型的项目目录结构 CMake模板 CMake编译运行 README.md 项目说明文档 智能家居项目目录 【智能家居】面向对象编程OOP和设计模式(工厂模式) 【智能家居】一、工厂模式实现继电器灯控制 【智能家居】二、添加火灾检测模块&#xff08;…

4-Docker命令之docker ps

1.docker ps介绍 docker ps命令是用来列出容器的相关信息 2.docker ps用法 docker ps [参数] [rootcentos79 ~]# docker ps --helpUsage: docker ps [OPTIONS]List containersAliases:docker container ls, docker container list, docker container ps, docker psOptions…

【重点】【二叉树】199.二叉树的右视图

题目 法1:层次遍历 最佳方法&#xff0c;牢记&#xff01;&#xff01;&#xff01; class Solution {public List<Integer> rightSideView(TreeNode root) {List<Integer> res new ArrayList<>();if (root null) {return res;}Queue<TreeNode> q…

Java 克隆:复制构造函数与克隆

为了实现克隆&#xff0c;我们需要配置我们的类并遵循以下步骤&#xff1a; 在我们的类或其超类或接口中实现 Cloneable 接口。 定义一个应处理 CloneNotSupportedException&#xff08;抛出或记录&#xff09;的 clone() 方法。 并且&#xff0c;在大多数情况下&#xff0c;我…