1 权限
<!-- 添加快捷方式 -->
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<!-- 移除快捷方式 -->
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />
<!-- 查询快捷方式 -->
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
2 创建快捷方式
/**
* 创建快捷方式
*
* @param name
* @param icon
* @param intent
*/
public void installShortCut(String name, int icon, Intent intent) {
Intent shortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
// 快捷方式的名称
shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, name);
shortcut.putExtra("duplicate", false); // 不允许重复创建
// 快捷方式的图标
ShortcutIconResource iconRes = ShortcutIconResource.fromContext(mContext, icon);
shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconRes);
intent.setAction("android.intent.action.MAIN");// 桌面图标和应用绑定,卸载应用后系统会同时自动删除图标
intent.addCategory("android.intent.category.LAUNCHER");// 桌面图标和应用绑定,卸载应用后系统会同时自动删除图标
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent);
mContext.sendBroadcast(shortcut);
}
3 删除桌面快捷方式
/**
* 删除桌面快捷方式
* @param context
* @param shortcutName
* 快捷方式名
* @param actionIntent
* 快捷方式操作,也就是上面创建的Intent
* @param isDuplicate
* 为true时循环删除快捷方式(即存在很多相同的快捷方式)
*/
public static void deleteShortcut(Context context , String shortcutName ,
Intent actionIntent , boolean isDuplicate) {
Intent shortcutIntent = new Intent ("com.android.launcher.action.UNINSTALL_SHORTCUT");
shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME ,shortcutName);
shortcutIntent.putExtra("duplicate" , isDuplicate);
shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT , actionIntent);
context.sendBroadcast(shortcutIntent);
}
修改快捷方式,需要增加权限:
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="com.android.launcher.permission.WRITE_SETTINGS" />
4 如果适配所有桌面,需要加上下面所列出的权限
这些权限不一定全,个别手机还是没有涵盖。
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="com.android.launcher.permission.WRITE_SETTINGS" />
<uses-permission android:name="com.android.launcher2.permission.READ_SETTINGS" />
<uses-permission android:name="com.android.launcher2.permission.WRITE_SETTINGS" />
<uses-permission android:name="com.android.launcher3.permission.READ_SETTINGS" />
<uses-permission android:name="com.android.launcher3.permission.WRITE_SETTINGS" />
<uses-permission android:name="org.adw.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="org.adw.launcher.permission.WRITE_SETTINGS" />
<uses-permission android:name="com.htc.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="com.htc.launcher.permission.WRITE_SETTINGS" />
<uses-permission android:name="com.qihoo360.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="com.qihoo360.launcher.permission.WRITE_SETTINGS" />
<uses-permission android:name="com.lge.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="com.lge.launcher.permission.WRITE_SETTINGS" />
<uses-permission android:name="net.qihoo.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="net.qihoo.launcher.permission.WRITE_SETTINGS" />
<uses-permission android:name="org.adwfreak.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="org.adwfreak.launcher.permission.WRITE_SETTINGS" />
<uses-permission android:name="org.adw.launcher_donut.permission.READ_SETTINGS" />
<uses-permission android:name="org.adw.launcher_donut.permission.WRITE_SETTINGS" />
<uses-permission android:name="com.huawei.launcher3.permission.READ_SETTINGS" />
<uses-permission android:name="com.huawei.launcher3.permission.WRITE_SETTINGS" />
<uses-permission android:name="com.fede.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="com.fede.launcher.permission.WRITE_SETTINGS" />
<uses-permission android:name="com.sec.android.app.twlauncher.settings.READ_SETTINGS" />
<uses-permission android:name="com.sec.android.app.twlauncher.settings.WRITE_SETTINGS" />
<uses-permission android:name="com.anddoes.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="com.anddoes.launcher.permission.WRITE_SETTINGS" />
<uses-permission android:name="com.tencent.qqlauncher.permission.READ_SETTINGS" />
<uses-permission android:name="com.tencent.qqlauncher.permission.WRITE_SETTINGS" />
<uses-permission android:name="com.huawei.launcher2.permission.READ_SETTINGS" />
<uses-permission android:name="com.huawei.launcher2.permission.WRITE_SETTINGS" />
<uses-permission android:name="com.android.mylauncher.permission.READ_SETTINGS" />
<uses-permission android:name="com.android.mylauncher.permission.WRITE_SETTINGS" />
<uses-permission android:name="com.ebproductions.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="com.ebproductions.android.launcher.permission.WRITE_SETTINGS" />
<uses-permission android:name="com.oppo.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="com.oppo.launcher.permission.WRITE_SETTINGS" />
<uses-permission android:name="com.huawei.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="com.huawei.android.launcher.permission.WRITE_SETTINGS" />
<uses-permission android:name="telecom.mdesk.permission.READ_SETTINGS" />
<uses-permission android:name="telecom.mdesk.permission.WRITE_SETTINGS" />
<uses-permission android:name="dianxin.permission.ACCESS_LAUNCHER_DATA" />
5 判断快捷方式是否存在的方法
if (LauncherUtil.isShortCutExist(mActivity, tvName)) {
Toast.makeText(mActivity, "添加桌面快捷方式成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(mActivity, "创建桌面图标失败,请检查系统应用设置快捷方式权限", Toast.LENGTH_LONG).show();
}
package org.stagex.danmaku.helper;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ProviderInfo;
import android.content.pm.ResolveInfo;
import android.database.Cursor;
import android.net.Uri;
import java.util.List;
/**
* Created by chenliguan on 2017/8/14 0014.
*/
public class LauncherUtil {
private static String AUTHORITY = null;
public static boolean isShortCutExist(Context context, String title) {
boolean isInstallShortcut = false;
if (null == context || StringUtils.isEmpty(title))
return isInstallShortcut;
if (StringUtils.isEmpty(AUTHORITY))
AUTHORITY = getAuthorityFromPermission(context);
final ContentResolver cr = context.getContentResolver();
if (!StringUtils.isEmpty(AUTHORITY)) {
try {
final Uri CONTENT_URI = Uri.parse(AUTHORITY);
Cursor c = cr.query(CONTENT_URI, new String[]{"title",
"iconResource"}, "title=?", new String[]{title},
null);
// XXX表示应用名称。
if (c != null && c.getCount() > 0) {
isInstallShortcut = true;
}
if (null != c && !c.isClosed())
c.close();
} catch (Exception e) {
// TODO: handle exception
Logger.e("isShortCutExist:" + e.getMessage());
}
}
return isInstallShortcut;
}
public static String getCurrentLauncherPackageName(Context context) {
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
ResolveInfo res = context.getPackageManager().resolveActivity(intent, 0);
if (res == null || res.activityInfo == null) {
// should not happen. A home is always installed, isn't it?
return "";
}
if (res.activityInfo.packageName.equals("android")) {
return "";
} else {
return res.activityInfo.packageName;
}
}
public static String getAuthorityFromPermissionDefault(Context context) {
return getThirdAuthorityFromPermission(context,
"com.android.launcher.permission.READ_SETTINGS");
}
public static String getThirdAuthorityFromPermission(Context context,
String permission) {
if (StringUtils.isEmpty(permission)) {
return "";
}
try {
List<PackageInfo> packs = context.getPackageManager()
.getInstalledPackages(PackageManager.GET_PROVIDERS);
if (packs == null) {
return "";
}
for (PackageInfo pack : packs) {
ProviderInfo[] providers = pack.providers;
if (providers != null) {
for (ProviderInfo provider : providers) {
if (permission.equals(provider.readPermission)
|| permission.equals(provider.writePermission)) {
if (!StringUtils.isEmpty(provider.authority)// 精准匹配launcher.settings,再一次验证
&& (provider.authority)
.contains(".launcher.settings"))
return provider.authority;
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
public static String getAuthorityFromPermission(Context context) {
// 获取默认
String authority = getAuthorityFromPermissionDefault(context);
// 获取特殊第三方
if (authority == null || authority.trim().equals("")) {
String packageName = getCurrentLauncherPackageName(context);
packageName += ".permission.READ_SETTINGS";
authority = getThirdAuthorityFromPermission(context, packageName);
}
// 还是获取不到,直接写死
if (StringUtils.isEmpty(authority)) {
int sdkInt = android.os.Build.VERSION.SDK_INT;
if (sdkInt < 8) { // Android 2.1.x(API 7)以及以下的
authority = "com.android.launcher.settings";
} else if (sdkInt < 19) {// Android 4.4以下
authority = "com.android.launcher2.settings";
} else {// 4.4以及以上
authority = "com.android.launcher3.settings";
}
}
authority = "content://" + authority + "/favorites?notify=true";
return authority;
}
}
6 注意
oppo 3.0系统后禁止了添加桌面。