1

アプリケーションにショートカットを追加したいのですが、手動で作成したネイティブのショートカットを複製しないようにすることができません(たとえば、アプリケーションメニューのアプリケーションアイコンをホーム画面にドラッグアンドドロップします)。

これが私のコードです:

public void addShortcut(Context context)
{
    this.manageShortcutAction(context, "com.android.launcher.action.INSTALL_SHORTCUT");
}

public void deleteShortcut(Context context)
{
    this.manageShortcutAction(context, "com.android.launcher.action.UNINSTALL_SHORTCUT");
}

private void manageShortcutAction(Context context, String intentAction)
{
    Context applicationContext = context.getApplicationContext();
    Intent shortcut = new Intent(intentAction);
    ApplicationInfo appInfo = applicationContext.getApplicationInfo();
    PackageManager packageManager= applicationContext.getPackageManager();
    String applicationName = (String) packageManager.getApplicationLabel(appInfo);

    shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, applicationName); // Shortcut name
    shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, packageManager.getLaunchIntentForPackage(appInfo.packageName));// Setup activity should be shortcut object 
    shortcut.putExtra("duplicate", false); // Just create once
    shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent.ShortcutIconResource.fromContext(applicationContext, appInfo.icon));// Set shortcut icon

    applicationContext.sendBroadcast(shortcut);
}


そして私のマニフェストには許可が必要です:

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


ちなみに、現在MainApplication拡張中のアプリケーションコードを上書きしてしまいましたApplicationIntent.EXTRA_SHORTCUT_INTENT期待する結果なしに、を作成するためのコンポーネントを作成しようとしました。

誰かがアイデアを持っているなら...

4

2 に答える 2

4

アプリのインストール時に(またはメニューからコピーして)作成されたショートカットの複製がアプリで作成されないようにするには、既存のショートカットと同じパラメーターを使用して作成する必要があることがわかりました。同じショートカット名を使用します。十分でない。

多くのテストの後、logcatのおかげで、次のように正確なレプリカを作成することができました。

private void installShortcut() {
    final Intent shortcutIntent = new Intent(getApplicationContext(), MainActivity.class);
    shortcutIntent.setAction(Intent.ACTION_MAIN);
    shortcutIntent.addCategory(Intent.CATEGORY_LAUNCHER);
    shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

    final Intent intent = new Intent();
    intent.putExtra("duplicate", false);
    intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
    intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name));
    intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent.ShortcutIconResource.fromContext(this, R.drawable.icon));
    intent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
    sendBroadcast(intent);
}

SOで見つけた他の回答との違いは、次の3行にあります。

    shortcutIntent.addCategory(Intent.CATEGORY_LAUNCHER);
    shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

これは、システムで作成されたショートカットを使用してアプリを手動で起動したときに印刷されたログエントリを見てわかりました。

Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.myapp/.activities.main.MainActivity bnds=[365,73][475,191] } from pid 279
于 2013-11-05T22:40:04.493 に答える
0

ソニーの開発者と話し合った後、手動で作成したショートカットを複製しない方法はありません...

私はサムスンのためのいくつかの方法を見つけましたが、これらは一般的ではありませんでした。

于 2013-02-11T14:36:18.987 に答える