2012-03-05 66 views
2

我正在嘗試爲任何已安裝的應用程序創建可編程性的主頁快捷方式。爲其他程序包活動創建shorcut的最佳方法

考慮到我唯一可用的應用程序名稱,比如說計算器com.android.calculator2(1.5)。

我正在使用當前的代碼波紋管,快捷方式已成功創建,但活動無法從快捷方式啓動(錯誤的活動類名稱,我猜),有時圖標似乎已損壞。

另外加com.android.launcher.permission.INSTALL_SHORTCUTmanifest.xml

有沒有最佳的方法來實現這一目標?

String appName = "com.android.calculator2"; 
Context newAppContext = null; 

// Get other package context 
try { 
    newAppContext = 
     context.createPackageContext(appName, Context.CONTEXT_IGNORE_SECURITY); 
} catch (NameNotFoundException e) { 
    e.printStackTrace(); 
} 

// Create shortcut 
if(newAppContext != null) { 
    // Get Application Name 
    PackageManager pm = context.getPackageManager(); 
    ApplicationInfo ai; 

    try { 
     ai = pm.getApplicationInfo(appName, 0); 
    } catch (final NameNotFoundException e) { 
     ai = null; 
    } 

    // Get application label 
    String applicationName = (String) (ai != null ? pm.getApplicationLabel(ai) : "(unknown)"); 

    // Shortcut intent 
    Intent shortcutIntent = new Intent (Intent.ACTION_MAIN); 

    /** Problem in here ** 
    shortcutIntent.setClassName(newAppContext, newAppContext.getClass().getName()); 
    *********************/ 

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

    // Create intent 
    final Intent putShortCutIntent = new Intent(); 
    putShortCutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent); 
    putShortCutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, applicationName); 
    putShortCutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, 
           Intent.ShortcutIconResource.fromContext(newAppContext, 
                     R.drawable.icon)); 
    putShortCutIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT"); 

    // Broadcast intent 
    context.sendBroadcast(putShortCutIntent); 
} 

編輯:

管理人正從PackageManager.getLaunchIntentForPackage(字符串的packageName)意圖實現這一目標。

所以:

// Intent shortcutIntent = new Intent (Intent.ACTION_MAIN); 
// shortcutIntent.setClassName(newAppContext, newAppContext.getClass().getName()); 
// shortcutIntent.addCategory(Intent.CATEGORY_LAUNCHER); 
// shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
// shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

Intent shorcutIntent = pm.getLaunchIntentForPackage(appName); 

回答

0

你會得到「錯誤的活動類的名字」,當它不能發現在包中的主要活動類。它需要這些信息,以便它可以在正確的包中啓動正確的活動。所以,在你的榜樣,它應該是:

shortcutIntent.setClassName("com.android.calculator2", "ClassName"); 

我不知道"ClassName"應該是什麼樣的計算器應用程序(也許你可以檢查它的源代碼),但它應該是這樣的"com.android.calculator2.MainActivity"

編輯:
好了,現在看來,這是有可能得到動態的"ClassName"

PackageManager packageManager = context.getPackageManager(); 
ResolveInfo info = packageManager.resolveActivity(shortcutIntent, 0); 
if(info != null) { 
    shortcutIntent.setClassName(info.activityInfo.packageName, info.activityInfo.name); 
} 
+0

謝謝@LAS_VEGAS,我理解這一點。但我想知道如何動態獲取活動名稱而不是硬編碼。 考慮到我只有包名「com.android.calculator2」,我可以使用PackageManager獲取它的ApplicationInfo,但沒有設法獲得包默認的Activity名稱。 – 2012-03-05 10:47:50

+0

@Luis查看我的編輯 – Caner 2012-03-05 13:12:38

+0

再次感謝@LAS_VEGAS,試過你的建議。然後,創建的快捷方式將調用打開快捷方式的應用程序對話框,也許我沒有正確解釋自己:) 不過,儘管如此,我仍然設法通過從PackageManager獲取Intent而不是手動定義一個Intent。 工作正常,因爲我不想以任何方式修改快捷方式,只需將它添加到主屏幕。 Intent shortcutIntent = pm.getLaunchIntentForPackage(appName); – 2012-03-05 17:27:20

相關問題