2012-01-04 7 views
3

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

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()); 

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

ответ

1

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

+0

Источник или что-нибудь еще? Я нашел образцы от разработчиков, которые смогли удалить другие ярлыки. НО, как CommonsWare сказал: «Нет необходимости в поддержке любого домашнего экрана для поддержки [uninstall_shortcut] [...]« – JacksOnF1re

+0

Я передумал. Вы просто ошибаетесь, и этот ответ не должен быть принят! Я сделал это за 5 минут до этого. Я добавлю некоторые ссылки и код в качестве ответа. – JacksOnF1re

0

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

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

4

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

[UPDATE]: Поскольку Android M, они уже полностью убрана поддержка для UNINSTALL_SHORTCUT намерения в AOSP Launcher3 и Google Старта. В настоящее время нет альтернативы или замены для этого 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, без любой корень (который является таким же, как и код op, поэтому он был не неправильно):

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); 

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

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

UninstallShortcutReceiver.java

very good answer from Dev-il for this topic

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

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
  • деятельностьInfo.packageName // packageName the activity belongs to
  • activityInfo.name //Launcher class name
Смежные вопросы