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