-
-
[原创]Android应用之【隐藏桌面图标的一种方法】
-
-
[原创]Android应用之【隐藏桌面图标的一种方法】
Android10之前的版本,应用程序调用方法PackageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP)可以隐藏在桌面上的图标,这样的程序如果被偷偷安装后,机主本人可能并不知道自己的手机被安装了某些程序。
但是android10之后的版本,如果应用中使用了四大组件(activity service broadcast contentprovider)或者需要动态申请权限,这个函数调用将失去效果,简单测试后,调用该方法后,程序的桌面图标效果如下:
- 若AndroidManifest.xml中activity的icon和roundIcon这两者都不是黑色,显示资源文件中定义的图标像素。
- 如果activity中的icon和roundIcon同时设置为黑色,则icon不显示,roundIcon显示为系统默认的空白图标。
因此,传统的方法调用将不再适用了。
网上流传一种方式是,设置activity的label为空字符串“”,icon和roundIcon的像素值为0的黑色图标。该方案链接为:
Android10.0应用图标隐藏方案(7.0-10.0)
上述方法中,icon和roundIcon的图标资源文件如下:
上文中,theme字段透明的设置:
实际测试后,这种方法的隐藏效果有重大缺陷,在调用本文开头的PackageManager.setComponentEnabledSetting方法后,桌面上的图标虽然被抹去了,但是留下了一个图标大小的黑影,并不像作者在文中所说的那样"完全看不到", 作者源码我在android12上亲自测试过,这时候,点击图标虽然完全没有效果,但是视觉上的缺陷是无法容忍的。
通过测试,我发现有一种隐藏图标的方式,其实现步骤如下:
- 设置主activity的intent-filter字段,其格式必须满足如下两点,一是在启动节点的activity中,包含默认的启动属性"android.intent.action.MAIN"和"android.intent.category.LAUNCHER",二是还要添加别的属性,比如android.intent.action.VIEW,这样作的目的就是破坏应用程序启动节点的默认设置,使之含有别的行为和动作,这样程序启动后就不能正常显示图标。
比如启动节点的如下设置:
- 使用Android scheme方式从浏览器启动(或者另外再安装一个程序,当作此程序的启动器)。要注意的是,浏览器scheme启动方式不是说客户端的浏览器访问路径触发启动应用程序,我原先以为,在客户端的浏览器中输入形如myscheme://myhost这样的url就可以触发程序的执行,但是反复测试没有效果,于是想到,会不会这种scheme方式,说的是访问服务器的web页面,该地址的页面中有个形如 "<a href="myscheme://myhost">点击此处启动Android程序</a>" 这样的标签,用户在浏览器中点击这个标签后,即可触发应用中Android的启动组件。
这个简单的逻辑,无形中浪费了很多时间。
源码如下,上述描述的内容,只需要关注测试项目中AndroidManifest.xml中的Application节区属性。
源码链接地址
[招生]系统0day安全班,企业级设备固件漏洞挖掘,Linux平台漏洞挖掘!