Android : java :アプリがインストールされたときにショートカットを作成

アプリがインストールされたときに自動でホームにアイコンを作成する方法について。
Kotlinのコードはこちら

パーミッションの設定

ショートカットを作成するにはcom.android.launcher.permission.INSTALL_SHORTCUTの権限が必要だ。
AndroidManifest.xmlのの子要素として以下を追加する。
AndroidManifest.xml:


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

処理

アプリを起動するショートカットを作成する処理はMainActivityのonCreateに記述するのが一般的だと思う。


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // ショートカットを作成する関数を呼び出す
    createShortcut();
}

ショートカットを作成する処理は次の流れで作成した。

  1. アプリの起動情報をもったインテントを作成→起動インテント
  2. アイコンのインテントを作成し、そのアクションに起動インテントをセットする
  3. sendBroadcast()でアイコンインテントを送信し、スクリーンに登録

消しても消しても、起動の度にショートカットを作成するアプリはうざいので最初の1回だけショートカットを作成するようにする。
そのためにSharedPreferencesを使う。

アプリを起動するショートカットを作成する処理:


// ショートカットを作成する関数      
private void createShortcut(){

    // 1回だけ作成
    SharedPreferences preference = PreferenceManager.getDefaultSharedPreferences(this);
    if(!preference.getBoolean("shortcut",false)) {

        // アプリを起動するインテント
        Intent launcherIntent = new Intent();

        launcherIntent.setClass(this, MainActivity.class);
        launcherIntent.setAction(Intent.ACTION_MAIN);
        launcherIntent.addCategory(Intent.CATEGORY_LAUNCHER);

        // ショートカットインテント用のアイコンを取得
        Intent.ShortcutIconResource icon = Intent.ShortcutIconResource.fromContext(this, R.mipmap.ic_launcher);

        // ショートカット用インテント
        Intent shortcutIntent = new Intent();
        shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, launcherIntent);
        shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "ショートカットタイトル");
        shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon); // アイコン画像セット
        shortcutIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");

        shortcutIntent.putExtra("duplicate", false); // ショートカットを重複して作らない

        // ショートカットの作成
        preference.edit().putBoolean("shortcut", true).commit();
        sendBroadcast(shortcutIntent);
    }
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です