Оптимальный способ создать ярлык для другой активности пакета - PullRequest
2 голосов
/ 05 марта 2012

Я пытаюсь создать программируемость домашнего ярлыка для любого установленного приложения.

Учитывая, что единственное, что у меня будет доступно, это имя приложения, скажем, например, Калькулятор com.android.calculator2 (1.5).

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

Также добавьте com.android.launcher.permission.INSTALL_SHORTCUT к manifest.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);
}

EDIT:

Для достижения этой цели удалось получить Intent из PackageManager.getLaunchIntentForPackage (String 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);

1 Ответ

0 голосов
/ 05 марта 2012

Вы получите «неправильное имя класса активности», когда он не сможет найти основной класс активности в пакете.Ему нужна эта информация, чтобы он мог запустить правильное действие в правильном пакете.В вашем примере это должно быть:

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