Android удаляет ярлыки в HomeScreen - PullRequest
3 голосов
/ 04 января 2012

Как убрать ярлыки на домашнем экране (программно). Я могу удалить созданные мной ярлыки, используя намерение, но не другие существующие ..

Bitmap theBitmap = ((BitmapDrawable)icon).getBitmap();

        Intent shortcutIntent = new Intent();
        shortcutIntent.setAction(Intent.ACTION_VIEW);


  shortcutIntent.setClassName(url, group);

   shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
   shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

   Intent removeIntent = new Intent();
   removeIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
   removeIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, name);
   removeIntent.putExtra("duplicate", false);
   removeIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON, theBitmap);
   removeIntent.setAction("com.android.launcher.action.UNINSTALL_SHORTCUT");

   sendBroadcast(removeIntent);

при удалении с использованием намерения, как описано выше, можно удалить ярлык, зная значок пакета имя + имя класса приложения. мы можем получить имя пакета значков для всех приложений, используя PackageInfo, следующим образом, но не имя класса запуска

ArrayList<PInfo> res = new ArrayList<PInfo>();        
        List<PackageInfo> packs = getPackageManager().getInstalledPackages(0);
        for(int i=0;i<packs.size();i++) {
            PackageInfo p = packs.get(i);



            if ((!getSysPackages) && (p.versionName == null)) {
                continue ;
            }
            PInfo newInfo = new PInfo();
            newInfo.appname = p.applicationInfo.loadLabel(getPackageManager()).toString();
            newInfo.pname = p.packageName;
            newInfo.classname = p.applicationInfo.className;
            newInfo.versionCode = p.versionCode;
            newInfo.icon = p.applicationInfo.loadIcon(getPackageManager());

Теперь проблема в том, существует ли какой-либо метод для получения имени класса приложения, тогда мы можем удалить ярлык, созданный этим приложением, на домашнем экране.

Ответы [ 3 ]

5 голосов
/ 03 декабря 2014

Это возможно.

[ОБНОВЛЕНИЕ]: Начиная с Android M , они полностью удалили поддержку намерения UNINSTALL_SHORTCUT в AOSP Launcher3 и Google Now Launcher. В настоящее время нет альтернативы или замены для этого API. Источник: https://code.google.com/p/android/issues/detail?id=179697


[ОБНОВЛЕНИЕ-2] : Может быть, это полезно для некоторых из вас. Мне удалось выяснить, как, по крайней мере, удалить моих приложений снимков с домашнего экрана. В то время как Google удалил поддержку удаления ярлыка, ярлык, указывающий на псевдоним активности, все равно будет удален, как только псевдоним будет отключен.

Маленькая ссылка:

   ComponentName yourAlias = new ComponentName(getPackageName(), "org.example.yourAliasName");

    if (show){
        flag = PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
    }else{
        flag = PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
    }


    context.getPackageManager().setComponentEnabledSetting(yourAlias, flag, PackageManager.DONT_KILL_APP);

ниже Android M:

Перво-наперво, вот код, который я неоднократно смог удалить ярлык Facebook, без любого корня (что аналогично коду оп, поэтому он был не неправильным):

    Intent appIntent = new Intent(Intent.ACTION_MAIN);
    appIntent.setComponent(new ComponentName("com.facebook.katana", "com.facebook.katana.LoginActivity"));
    appIntent.addCategory(Intent.CATEGORY_LAUNCHER);

    Intent addIntent = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "Facebook");
    addIntent.putExtra("duplicate", false);
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, appIntent);

    sendBroadcast(addIntent);

Важно то, что ваше намерение должно быть точно таким же, как и намерение, которое был использован для создания ярлыка. Вы можете, если у вас есть root, взглянуть на launcher.db и скопируйте URI. Расположен в data/data/com.android.Launcher.launcher.db Тем не менее, у вас нет доступа к Android Launcher.db в любое время, так что это может быть попытка и ошибка.

Источники, которые я настоятельно рекомендую прочитать:

UninstallShortcutReceiver.java

очень хороший ответ от Dev-il на эту тему

В дополнение, код для извлечения всех приложений и их данных, которые в моем Дело было достаточно, чтобы удалить большинство ярлыков.

PackageManager pManager = context.getPackageManager();
List<ResolveInfo> packageInfos = loadApps(context);

Отсюда вы можете перебирать список и получать необходимую информацию, например:

ActivityInfo activityInfo = packInfo.activityInfo;
  • activityInfo.loadLabel (pManager) .toString () //name of the App
  • activityInfo.loadIcon (pManager) //Icon of the activity as drawable
  • ActivityInfo.packageName // packageName the activity belongs to
  • activityInfo.name //Launcher class name
1 голос
/ 04 января 2012

Вы не можете программно удалить другие ярлыки с домашнего экрана

0 голосов
/ 16 июня 2014

Используйте следующий метод:

    private void removeShortcutIcon(String app_name, Intent app_intent){
    app_intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    app_intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    Intent removeIntent = new Intent();
    removeIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, app_intent);
    removeIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, app_name);
    removeIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent.ShortcutIconResource.fromContext(getApplicationContext(), R.drawable.ic_launcher));
    removeIntent.setAction("com.android.launcher.action.UNINSTALL_SHORTCUT");
    getApplicationContext().sendBroadcast(removeIntent);
}

И попробуйте получить все установленные приложения следующим образом:

PackageManager pm = getPackageManager();
List<ResolveInfo> pacs_list = pm.queryIntentActivities(main_intent, 0);
for(int i=0; i < pacs_list.size(); i++)
{
pacs_list.get(i).loadIcon(pm);
pacs_list.get(i).activityInfo.packageName;
pacs_list.get(i).loadLabel(pm).toString();
}

Примечание: вы можете получить различные атрибуты из ResolveInfo.Проверьте эту ссылку: ResolveInfo

...