Java 为其他包活动创建shorcut的最佳方法

Java 为其他包活动创建shorcut的最佳方法,java,android,android-activity,android-intent,shortcut,Java,Android,Android Activity,Android Intent,Shortcut,我正在尝试为任何已安装的应用程序创建可编程性主页快捷方式 考虑到我唯一可用的是应用程序名,比如Calculator com.android.Calculator 2 1.5 我正在使用下面的当前代码,快捷方式已成功创建,但无法从快捷方式启动活动我猜是错误的活动类名,有时图标似乎已损坏 同时将com.android.launcher.permission.INSTALL_快捷方式添加到manifest.xml 有没有最佳的方法来实现这一点 String appName = "com.android

我正在尝试为任何已安装的应用程序创建可编程性主页快捷方式

考虑到我唯一可用的是应用程序名,比如Calculator com.android.Calculator 2 1.5

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

同时将com.android.launcher.permission.INSTALL_快捷方式添加到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);
}
编辑:

通过从PackageManager.getLaunchIntentForPackageString packageName获取意图来实现此目的

因此:


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

shortcutIntent.setClassName("com.android.calculator2", "ClassName");
我不知道计算器应用程序的类名应该是什么,也许你可以查看它的源代码,但它应该是com.android.calculator2.MainActivity之类的

编辑: 好的,似乎可以动态获取类名:

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

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

shortcutIntent.setClassName("com.android.calculator2", "ClassName");
我不知道计算器应用程序的类名应该是什么,也许你可以查看它的源代码,但它应该是com.android.calculator2.MainActivity之类的

编辑: 好的,似乎可以动态获取类名:

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

谢谢你,拉斯维加斯,我明白。但我想知道如何动态获取活动名称,而不是硬编码。考虑到我只能使用包名com.android.calculator2,因此我可以使用PackageManager获取其应用程序信息,但未能获得包的默认活动名。再次感谢@LAS_VEGAS,尝试了您的建议。创建的快捷方式将调用打开快捷方式的应用程序对话框,也许我没有正确地解释自己:好吧,尽管如此,我还是通过从PackageManager获得意图而不是手动定义一个来实现我想要的。工作正常,因为我不打算以任何方式修改快捷方式,只需将其添加到主屏幕即可。Intent shortcutient=pm.getLaunchIntentForPackageappName;谢谢你,拉斯维加斯,我明白。但我想知道如何动态获取活动名称,而不是硬编码。考虑到我只能使用包名com.android.calculator2,因此我可以使用PackageManager获取其应用程序信息,但未能获得包的默认活动名。再次感谢@LAS_VEGAS,尝试了您的建议。创建的快捷方式将调用打开快捷方式的应用程序对话框,也许我没有正确地解释自己:好吧,尽管如此,我还是通过从PackageManager获得意图而不是手动定义一个来实现我想要的。工作正常,因为我不打算以任何方式修改快捷方式,只需将其添加到主屏幕即可。Intent shortcutient=pm.getLaunchIntentForPackageappName;