Android-android创建已安装的程序的快捷方式

Android-android创建已安装的程序的快捷方式

夜无邪 发布于 2016-11-20 字数 904 浏览 1046 回复 1

又有问题麻烦大家了?
我是做市场的,需要简单管理下用户已经安装的应用,产品希望能过通关我们自己的程序,去给用户创建,他所安装的程序的快捷方式。 就是你装了 a,b,c,d,四个软件, 你都可以通过我的程序在桌面生成快捷方式。
可悲的是,我懂创建自己的,但是。。创建别人的。。
写上相对的权限之后:

Intent addIntent=new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
Parcelable icon=Intent.ShortcutIconResource.fromContext(this, R.drawable.png); //获取快捷键的图标
Intent myIntent=new Intent(this, ShortCutAction.class);
addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "快捷方式");//快捷方式的标题
addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon);//快捷方式的图标
addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, myIntent);//快捷方式的动作
sendBroadcast(addIntent);//发送广播

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

想挽留 2017-01-27 1 楼

去分析了下源码。。。举得可以写成这样,分享下给大家! 不过很明显,如果别家的应用的icon, 不是 icon.png ,那就悲催了。。

/**
* 包名 getPackageName
* 主Activity名 getActivitys
* apk应用名 getAppName
* **/
private void installShortCut(String getPackageName,String getActivitys,String getAppName){
Intent shortcutIntent = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, getAppName);
// 是否可以有多个快捷方式的副本,参数如果是true就可以生成多个快捷方式,如果是false就不会重复添加
shortcutIntent.putExtra("duplicate", false);
Intent mainIntent = new Intent(Intent.ACTION_MAIN);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
// 要删除的应用程序的ComponentName,即应用程序包名+activity的名字
mainIntent.setComponent(new ComponentName(getPackageName, getActivitys));
//mainIntent.setClass(this, this.getClass());
ShortcutIconResource icon = new ShortcutIconResource();
icon.packageName = getPackageName;
icon.resourceName = getPackageName+":drawable/icon";
shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, mainIntent);
shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon);
sendBroadcast(shortcutIntent);
}

经过 的旁敲侧击,倾心指导,耐心讲解,整出了一下的代码。结合我的问题,还有上一个答案,我觉得,关于android 创建快捷方式的问题就应该处理相当的可以了。

/**
* @param context
* 执行者。
* @params pkg 待添加快捷方式的应用包名,其值不可为null。
* @return 返回true为正常执行完毕,<br/>
* 返回false为pkg值为null或者找不到该应用或者该应用无用于Launch的MainActivity 。
* @author sodino
* */
public boolean addShortcut(Context context, String pkg,News news) {
// 快捷方式名
String title = news.getTitle();
// MainActivity完整名
String mainAct = null;
// 应用图标标识
int iconIdentifier = 0;
// 根据包名寻找MainActivity
PackageManager pkgMag = context.getPackageManager();
Intent queryIntent = new Intent(Intent.ACTION_MAIN, null);
queryIntent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> list = pkgMag.queryIntentActivities(queryIntent,
PackageManager.GET_ACTIVITIES);
for (int i = 0; i < list.size(); i++) {
ResolveInfo info = list.get(i);
if (info.activityInfo.packageName.equals(pkg)) {
title = info.loadLabel(pkgMag).toString();
mainAct = info.activityInfo.name;
iconIdentifier = info.activityInfo.applicationInfo.icon;
break;
}
}
if (mainAct == null) {
// 没有启动类
return false;
}
Intent shortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
// 快捷方式的名称
shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, title);
//不允许重复创建
// shortcut.putExtra("duplicate", false);
ComponentName comp = new ComponentName(pkg, mainAct);
shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT,
new Intent(Intent.ACTION_MAIN).setComponent(comp));
// 快捷方式的图标
Context pkgContext = null;
if (context.getPackageName().equals(pkg)) {
pkgContext = context;
} else {
// 创建第三方应用的上下文环境,为的是能够根据该应用的图标标识符寻找到图标文件。
try {
pkgContext = context.createPackageContext(pkg, Context.CONTEXT_IGNORE_SECURITY
| Context.CONTEXT_INCLUDE_CODE);
} catch (NameNotFoundException e) {
e.printStackTrace();
}
}
if (pkgContext != null) {
ShortcutIconResource iconRes = Intent.ShortcutIconResource.fromContext(pkgContext,
iconIdentifier);
shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconRes);
}
// 发送广播,让接收者创建快捷方式
// 需权限<uses-permission
// android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
context.sendBroadcast(shortcut);
return true;
}