像 Telegram 一样更改应用程序图标

问题描述 投票:0回答:1

我需要以编程方式实现更改应用程序图标,就像在 Telegram 应用程序中一样。我在谷歌上搜索了答案,但没有找到类似的东西。在 Telegram 应用程序的应用程序设置中,您可以将默认的应用程序图标替换为建议的图标之一,重新启动应用程序后,图标会发生变化。

S e A r C 谷歌中的 h

android android-studio icons
1个回答
0
投票

动态更改启动器应用程序图标的简单步骤

第 1 步:- 创建空类来声明您想要的图标 在应用程序启动器图标中使用(如果你有 n 个图标,那么你必须 创建 n 个空类),例如,我使用了 2 个图标,所以我 创建了 2 个类,一个用于新启动器图标,另一个用于旧图标。 对于新图标,我创建了一个类 NewIconAlias ,对于旧图标,我创建了一个类 旧图标别名。

NewLauncherAlias.kt

class NewLauncherAlias {
}

旧启动器别名.kt

class OldLauncherAlias {
}

第 2 步:- 在清单中声明

<activity-alias>
。 注意:- 我们必须在清单中声明要用于动态更改启动器图标的所有图标。

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">

<application
    android:allowBackup="true"
    android:dataExtractionRules="@xml/data_extraction_rules"
    android:fullBackupContent="@xml/backup_rules"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/Theme.DynamicLauncherIcon"
    tools:targetApi="31">
    <activity
        android:name=".MainActivity"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
        </intent-filter>
    </activity>
    <activity-alias
        android:name="com.demo.dynamiclaunchericon.alias.OldLauncherAlias"
        android:enabled="true"
        android:icon="@mipmap/ic_launcher"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:label="Old Icon"
        android:targetActivity=".MainActivity"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity-alias>
    <activity-alias
        android:name="com.demo.dynamiclaunchericon.alias.NewLauncherAlias"
        android:enabled="false"
        android:icon="@mipmap/ic_launcher_new"
        android:roundIcon="@mipmap/ic_launcher_new_round"
        android:label="New Icon"
        android:targetActivity=".MainActivity"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity-alias>
</application>

我们只有 2 个图标,所以我们声明 2 个。

第3步:-现在我们必须从 Activity/Fragment 执行更改启动器图标请求。 对于更改启动器图标,我们必须首先禁用旧的或现有的启动器图标,然后启用我们在清单中声明的新图标。

禁用旧的/现有的图标:-

packageManager.setComponentEnabledSetting(
        ComponentName(
            this@MainActivity,
            OldLauncherAlias::class.java,
        ),
        PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
        PackageManager.DONT_KILL_APP,
    )

启用新图标:-

packageManager.setComponentEnabledSetting(
        ComponentName(
            this@MainActivity,
            NewLauncherAlias::class.java,
        ),
        PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
        PackageManager.DONT_KILL_APP,
    )

更新启动器图标的活动代码:-

class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val mBinding = ActivityMainBinding.inflate(LayoutInflater.from(this))
    setContentView(mBinding.root)
    mBinding.changeIcon.setOnClickListener {
        updateToNewIcon(this)
    }

    mBinding.oldIcon.setOnClickListener {
        updateToOldIcon(this)
    }
}

private fun updateToOldIcon(MainActivity: MainActivity) {
    packageManager.setComponentEnabledSetting(
        ComponentName(
            this@MainActivity,
            OldLauncherAlias::class.java,
        ),
        PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
        PackageManager.DONT_KILL_APP,
    )
    packageManager.setComponentEnabledSetting(
        ComponentName(
            this@MainActivity,
            NewLauncherAlias::class.java,
        ),
        PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
        PackageManager.DONT_KILL_APP,
    )
    Toast.makeText(
        this@MainActivity,
        "Launcher one has been applied successfully",
        Toast.LENGTH_SHORT,
    ).show()
}

fun updateToNewIcon(context: Activity) {
    packageManager.setComponentEnabledSetting(
        ComponentName(
            this@MainActivity,
            OldLauncherAlias::class.java,
        ),
        PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
        PackageManager.DONT_KILL_APP,
    )
    packageManager.setComponentEnabledSetting(
        ComponentName(
            this@MainActivity,
            NewLauncherAlias::class.java,
        ),
        PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
        PackageManager.DONT_KILL_APP,
    )

    Toast.makeText(
        this@MainActivity,
        "Launcher one has been applied successfully",
        Toast.LENGTH_SHORT,
    ).show()
}
}

您可以从GitHub

查看完整的演示项目
© www.soinside.com 2019 - 2024. All rights reserved.