1. ホーム
  2. android

[解決済み] Androidでアプリケーションのアイコンをプログラム的に変更するには?

2022-04-23 12:24:16

質問

アプリケーションのアイコンをプログラムから直接変更することは可能ですか?

つまり icon.png の中に res\drawable フォルダーに格納されます。

アプリケーションのアイコンをプログラムから変更できるようにし、次回からはランチャーに前回選択したアイコンが表示されるようにしたいです。

解決方法は?

古い質問ですが、Androidには明確な機能がないため、まだ有効です。そして、facebookの人たちは、どうにかして回避策を見つけました。今日、私は自分にとって有効な方法を見つけました。完璧ではありませんが(この回答の最後にある備考を参照してください)、うまくいきました。

主なアイデアは、ホーム画面にランチャーで作成されたアプリのショートカットのアイコンを更新することです。ショートカットアイコン上の何かを変更したい場合、まずそれを削除し、新しいビットマップで再作成します。

以下はそのコードです。これはボタンがあります increment . 押されると、ショートカットは新しいカウント番号を持つものに置き換えられます。

まず、マニフェストにこの2つのパーミッションが必要です。

<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />

そして、ショートカットのインストールとアンインストールには、この2つの方法が必要です。その 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);
}

そして最後に、最初のショートカットを追加し、カウンターをインクリメントしながらショートカットを更新する2つのリスナーを紹介します。

@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 ショートカットがインストールされたときと、アンインストールされたときに、それぞれ1つずつ。そのため、2つの Toast を変更するたびに、アイコンを変更します。これは完璧ではありませんが、まあ、私のアプリの他の部分が完璧である限りは......。