有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为其他包活动创建shorcut的最佳方式

我试图为任何已安装的应用程序创建一个可编程的主页快捷方式

考虑到我唯一可用的是应用程序名,比如计算器com.安卓.calculator2(1.5)

我正在使用下面的当前代码,快捷方式已成功创建,但无法从快捷方式启动活动(我猜是错误的活动类名),而且有时图标似乎已损坏

同时将com.安卓.launcher.permission.INSTALL_SHORTCUT添加到manifest.xml

有没有实现这一目标的最佳方法

String appName = "com.安卓.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.安卓.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);

共 (1) 个答案

  1. # 1 楼答案

    当它在包中找不到主活动类时,您将得到“错误的活动类名称”。它需要这些信息,以便在正确的包中启动正确的活动。所以在你的例子中,应该是:

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