2012-01-04 273 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

Source or anything?我從能夠刪除其他快捷方式的開發人員那裏找到樣本。但正如CommonsWare所說:「不需要任何主屏幕實現來支持[uninstall_shortcut] [...]」 – JacksOnF1re 2014-12-03 12:49:19

+0

我改變了主意。你完全錯了,不應該接受這個答案!我在5分鐘前做了。 我會添加一些鏈接和代碼作爲答案。 – JacksOnF1re 2014-12-03 17:52:22

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

這是可能的。

[更新]:由於版本的Android M,他們已經在AOSP Launcher3和谷歌現在啓動的UNINSTALL_SHORTCUT意圖完全去除的支持。目前沒有替代或替代此API。 來源:https://code.google.com/p/android/issues/detail?id=179697


[更新2]:也許這是一些您有所幫助。我能夠弄清楚,至少 - 卸載我的應用程序自己的主屏幕上的 shotscuts。儘管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相同,作爲 用於創建快捷方式的意圖。如果您有root用戶,可以查看 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
  • activityInfo.packageName // packageName the activity belongs to
  • activityInfo.name //Launcher class name