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

2024-06-04 3909阅读

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、测试代码


    
    
        
        
            
            
                
                
                
                
                
                
                
            
        
        
        
 
        
            
                
            
            
                
                
                
                
                
                
                
            
        
        
            
                
                


                


            
        
        
            
                
                
            
        
        
            
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
            
        
    

MainActivity.java

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //adb shell settings get global show_hidden_icon_apps_enabled
        try {
            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;
    @Override
    protected 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();
    }
}

    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]