为Android应用创建快捷方式是通过发送创建快捷方式的广播,然后确定唯一的Activity是通过action加category,然后Android的指引都是intent,所以创建广播的代码中必须要有指向该唯一activity的intent,然后发送广播,由系统把这个intent相关信息添加到桌面launcher要读取的用来保存快捷方式的数据表中,(一般是favorite表,不一般的就另做处理了)
代码最亲切,上代码:
首先要为该应用添加必要的权限
测试环境为Adnroid
2.1
以上。
第一步:AndroidManifest.xml 权限配置:
添加快捷方式权限:
<uses-permission android:name=
"com.android.launcher.permission.INSTALL_SHORTCUT"
/>
验证快捷方式是否存在权限:
<uses-permission android:name=
"com.android.launcher.permission.READ_SETTINGS"
/>
删除快捷方式权限:
<uses-permission android:name=
"com.android.launcher.permission.UNINSTALL_SHORTCUT"
/>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
代码如下:
/**
* 添加快捷方式
*/
public
class
ShortCutSample {
public
void
creatShortCut(Activity activity,String shortcutName,
int
resourceId)
{
Intent intent =
new
Intent();
intent.setClass(activity, activity.getClass());
//以下两句是为了在卸载应用的时候同时删除桌面快捷方式
intent.setAction(
"android.intent.action.MAIN"
);
intent.addCategory(
"android.intent.category.LAUNCHER"
);
Intent shortcutintent =
new
Intent(
"com.android.launcher.action.INSTALL_SHORTCUT"
);
//不允许重复创建
shortcutintent.putExtra(
"duplicate"
,
false
);
//需要实现的快捷方式的名称
shortcutintent.putExtra(Intent.EXTRA_SHORTCUT_NAME, shortcutName);
//快捷方式的图标
Parcelable icon = Intent.ShortcutIconResource.fromContext(activity.getApplicationContext(), resourceId);
shortcutintent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon);
//点击快捷图片,运行的程序主入口
shortcutintent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent);
//发送广播,完成创建
activity.sendBroadcast(shortcutintent);
}
}
//删除快捷方式
public
void
deleteShortCut(Activity activity,String shortcutName) {
Intent shortcut =
new
Intent(
"com.android.launcher.action.UNINSTALL_SHORTCUT"
);
//快捷方式的名称
shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME,shortcutName);
//在网上看到到的基本都是一下几句,测试的时候发现并不能删除快捷方式。
//String appClass = activity.getPackageName()+"."+ activity.getLocalClassName();
//ComponentName comp = new ComponentName( activity.getPackageName(), appClass);
//shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent(Intent.ACTION_MAIN).setComponent(comp));
//改成以下方式能够成功删除,估计是删除和创建需要对应才能找到快捷方式并成功删除
Intent intent =
new
Intent();
intent.setClass(activity, activity.getClass());
intent.setAction(
"android.intent.action.MAIN"
);
intent.addCategory(
"android.intent.category.LAUNCHER"
);
shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT,intent);
activity.sendBroadcast(shortcut);
}
// 判断是否存在快捷方式
private
boolean
hasShortCutBefore(String shortcutName) {
boolean
isInstallShortcut =
false
;
final
ContentResolver cr =
this
.getContentResolver();
String permission =
"com.android.launcher.permission.READ_SETTINGS"
;
//拥有读取setting权限的应用
List<PackageInfo> packs =
this
.getPackageManager().getInstalledPackages(PackageManager.GET_PROVIDERS);
//找出所有已安装并提供服务的包信息
if
(packs ==
null
) {
return
false
;
}
String tempAuthority =
null
;
for
(PackageInfo pack : packs) {
ProviderInfo[] providers = pack.providers;
if
(providers !=
null
) {
for
(ProviderInfo provider : providers) {
//遍历提供
if
(permission.equals(provider.readPermission) || permission.equals(provider.writePermission)) {
//如果该提供者的读或者写权限跟我们申请的权限相同,则确定了位置
tempAuthority = provider.authority;
}
}
}
}
final
String AUTHORITY = tempAuthority ==
null
?
"com.android.launcher.settings"
: tempAuthority;
//默认在这个地址com.android.launcher.settings
try
{
//加异常捕获是因为有些表名居然不是favorites
Cursor c = cr.query(CONTENT_URI,
new
String[]{
"title"
,
"iconResource"
},
"title=?"
,
new
String[]{shortcutName},
null
);
if
(c !=
null
&& c.getCount() >
0
) {
isInstallShortcut =
true
;
c.close();
}
}
catch
(Exception e){
}
return
isInstallShortcut;
}
调用测试代码,
代码如下:
public
class
mainActivity
extends
Activity {
// Called when the activity is first created.
@Override
public
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.main);
ShortCutSample sample =
new
ShortCutSample();
String shortcutName=getString(R.string.app_name);
if
(sample.hasShortcut(
this
, shortcutName))
sample.deleteShortCut(
this
,shortcutName);
else
sample.creatShortCut(
this
,shortcutName,R.drawable.icon);
}
}
|