当前位置:  开发笔记 > 编程语言 > 正文

如何在Android中以编程方式更改应用程序图标?

如何解决《如何在Android中以编程方式更改应用程序图标?》经验,为你挑选了6个好方法。

是否可以直接从程序中更改应用程序图标?
我的意思是,改变icon.png了在res\drawable文件夹中.
我想让用户从程序中更改应用程序的图标,以便下次他们在启动器中看到之前选择的图标.



1> 小智..:

试试这个,它对我来说很好:

1.修改您的MainActivity部分AndroidManifest.xml,从中删除,与部分中的MAIN类别intent-filter对齐


    
        ==>  <== Delete this line
        
    

2.为每个图标创建.像这样


    
        
        
       

3.以编程方式设置:为相应的设置ENABLE属性activity-alias

 getPackageManager().setComponentEnabledSetting(
        new ComponentName("ru.quickmessage.pa", "ru.quickmessage.pa.MainActivity-Red"), 
            PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

注意,必须始终至少启用一个.


实际上代码的作用是什么?请你解释一下
我不能启动我的应用程序,因为我删除了这个:
遗憾的是,我试过的设备的工作方式不同.适用于HTC Desire 2.2,但在Galaxy Nexus 4.2.2和Nexus 7 4.3上不可靠.在Galaxy Nexus上,可以导致应用程序的所有图标消失,以及任何小部件被删除.可惜,所以我不得不在以后的设备上删除此功能.
运行应用程序时出错。找不到默认活动。

2> jboi..:

这是一个老问题,但仍然有效,因为没有明确的Android功能.来自facebook的人找到了一个解决方法 - 不知何故.今天,我发现了一种适合我的方式.不完美(请参阅本答案末尾的评论),但它确实有效!

主要的想法是,我更新了我的主屏幕上的启动器创建的应用程序快捷方式的图标.当我想在快捷方式图标上更改某些内容时,我先删除它并使用新的位图重新创建它.

这是代码.它有一个按钮increment.按下时,快捷方式将替换为具有新计数的快捷方式.

首先,您需要在清单中使用这两个权限:



然后,您需要这两种方法来安装和卸载快捷方式.该shortcutAdd方法创建一个带有数字的位图.这只是为了证明它实际上发生了变化.您可能希望在应用中使用某些内容更改该部分.

private void shortcutAdd(String name, int number) {
    // Intent to be send, when shortcut is pressed by user ("launched")
    Intent shortcutIntent = new Intent(getApplicationContext(), Play.class);
    shortcutIntent.setAction(Constants.ACTION_PLAY);

    // Create bitmap with number in it -> very default. You probably want to give it a more stylish look
    Bitmap bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
    Paint paint = new Paint();
    paint.setColor(0xFF808080); // gray
    paint.setTextAlign(Paint.Align.CENTER);
    paint.setTextSize(50);
    new Canvas(bitmap).drawText(""+number, 50, 50, paint);
    ((ImageView) findViewById(R.id.icon)).setImageBitmap(bitmap);

    // Decorate the shortcut
    Intent addIntent = new Intent();
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, name);
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON, bitmap);

    // Inform launcher to create shortcut
    addIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
    getApplicationContext().sendBroadcast(addIntent);
}

private void shortcutDel(String name) {
    // Intent to be send, when shortcut is pressed by user ("launched")
    Intent shortcutIntent = new Intent(getApplicationContext(), Play.class);
    shortcutIntent.setAction(Constants.ACTION_PLAY);

    // Decorate the shortcut
    Intent delIntent = new Intent();
    delIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
    delIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, name);

    // Inform launcher to remove shortcut
    delIntent.setAction("com.android.launcher.action.UNINSTALL_SHORTCUT");
    getApplicationContext().sendBroadcast(delIntent);
}

最后,这里有两个监听器添加第一个快捷方式并使用递增计数器更新快捷方式.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.test);
    findViewById(R.id.add).setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            shortcutAdd("changeIt!", count);
        }
    });
    findViewById(R.id.increment).setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            shortcutDel("changeIt!");
            count++;
            shortcutAdd("changeIt!", count);
        }
    });
}

备注:

如果您的应用程序控制主屏幕上的更多快捷方式,例如使用不同的额外内容,这种方式也适用Intent.它们只需要不同的名称,以便卸载并重新安装正确的名称.

Android中快捷方式的程序化处理是众所周知的,广泛使用但未经官方支持的Android功能.它似乎适用于默认启动器,我从未尝试过其他任何地方.所以不要怪我,当你收到这个用户的电子邮件"它不适用于我的XYZ,双根,超级爆破手机"

启动器Toast在安装快捷方式时写入一个,在卸载快捷方式时写入一个.所以Toast每次更改图标时我都会得到两个.这不是完美的,但是,只要我的应用程序的其余部分是完美的...


今天的日历应用程序每天都可以在没有祝酒的情况下制作图标.
不幸的是,_shortcutDel_在棉花糖中不再起作用,另请参见http://stackoverflow.com/a/33731620/1545993
这取代了快捷图标,而不是启动器图标
在下面的几行中,什么是Play.class和Constants.ACTION_PLAY。Intent ShortcutIntent = new Intent(getApplicationContext(),Play.class); shortcutIntent.setAction(Constants.ACTION_PLAY);

3> CommonsWare..:

除非通过软件升级,否则无法更改已签名密封的APK中的清单或资源.


@Nanne:这是一个app小部件或主屏幕功能,而不是应用程序图标.除了通过软件升级之外,您仍然无法更改清单或资源.
@NeTeInStEiN:它不适用于所有主屏幕(例如,那些不关注启用组件的更改的主屏幕).

4> Andrei Marcu..:

以编程方式,您可能希望自己发布应用程序启动器:

注意:此方法不再适用于Android 8.0 - Oreo

在AndroidManifest.xml中,添加:


然后你需要创建你的应用程序启动器意图:

Intent myLauncherIntent = new Intent();
myLauncherIntent.setClassName("your.package.name", "YourLauncherActivityName");
myLauncherIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

使用您的应用启动器和自定义图标创建安装快捷方式意图:

Intent intent = new Intent();
intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, myLauncherIntent);
intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "Application Name");
intent.putExtra
       (
        Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
        Intent.ShortcutIconResource.fromContext
                                    (
                                         getApplicationContext(), 
                                         R.drawable.app_icon
                                    )
       );
intent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");

最后发布广播意图:

getApplicationContext().sendBroadcast(intent);


请注意,这不会起作用,因为奥利奥

5> Marius Kjeld..:

假设您的意思是更改主屏幕上显示的图标,可以通过创建完全相同的小部件轻松完成.这篇文章演示了如何为类似于iPhone的"新消息"类型应用程序实现:

http://www.cnet.com/8301-19736_1-10278814-251.html



6> Deqing..:

@ PA的解决方案部分适用于我.详细说明以下我的发现

1)第一个代码段不正确,见下文:


        ==>  <== This line shouldn't be deleted, otherwise will have compile error
         //DELETE THIS LINE
    

2)在启用另一个图标之前,应使用以下代码禁用所有图标,否则它将添加新图标,而不是替换它.

getPackageManager().setComponentEnabledSetting(
        getComponentName(), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);

但是,如果你使用上面的代码,那么主屏幕上的快捷方式将被删除!它不会自动添加回来.您可以以编程方式添加图标,但它可能不会保持与以前相同的位置.

3)请注意,图标不会立即更改,可能需要几秒钟.如果您在更改后立即单击它,则可能会收到错误消息:"未安装应用程序".

所以,恕我直言这个解决方案只适用于改变应用程序启动器中的图标,而不适用于快捷方式(即主屏幕上的图标)


运行app时出错.未找到默认活动.
推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有