判断shutcut是否安装
<!-- 需要权限 -->
<uses-permission android:name=
"com.android.launcher.permission.READ_SETTINGS"
/>
这段代码在模拟器上运行没有问题,但是在htc s510e运行报异常
Failed to find provider info for com.android.launcher2.settings
通过
但因htc所有包发现htc中的
launcher被定制了改名为com.htc.launcher,所以这一段代码的通用行很差一般不对shortCut进行判断都是直接添加
public boolean isAddShortCut() { boolean isInstallShortcut = false; final ContentResolver cr = this.getContentResolver(); int versionLevel = android.os.Build.VERSION.SDK_INT; String AUTHORITY = "com.android.launcher2.settings"; //2.2以上的系统的文件文件名字是不一样的 if (versionLevel >= 8) { AUTHORITY = "com.android.launcher2.settings"; } else { AUTHORITY = "com.android.launcher.settings"; } final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/favorites?notify=true"); Cursor c = cr.query(CONTENT_URI, new String[] { "title", "iconResource" }, "title=?", new String[] { getString(R.string.app_name) }, null); if (c != null && c.getCount() > 0) { isInstallShortcut = true; } return isInstallShortcut; }
创建shortcut在桌面快捷方式只要加入
action android:name="android.intent.action.CREATE_SHORTCUT" />
<activity android:name=".Activity01" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.CREATE_SHORTCUT" /> </intent-filter> </activity> </application>
当点击shotcutList中的此shortcut则会打开这个Activity执行下面的代码
public class Activity01 extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent addShortcut; Log.e("-----------------------", getIntent().getAction()+" : "+Intent.ACTION_CREATE_SHORTCUT); if (getIntent().getAction().equals(Intent.ACTION_CREATE_SHORTCUT)) { addShortcut = new Intent(); addShortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, "发送邮件"); Parcelable icon = Intent.ShortcutIconResource.fromContext(this,R.drawable.mail_edit); addShortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,icon); Intent mailto = new Intent(Intent.ACTION_SENDTO, Uri.parse( "mailto:xxx@xxx.com" )); addShortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, mailto); setResult(RESULT_OK,addShortcut); } finish(); } }
直接添加shortcut到桌面:同样这给方法在模拟器上添加成功但是在HTC S510e验证失败,应该也是HTC订制导致的,查看android的源码了解到icon的添加(也就是在里面的icon列表)和shortcut的添加都是通过recevier来接受通知的,但是他定义的Action:
public static final String ACTION_INSTALL_SHORTCUT ="com.android.launcher.action.INSTALL_SHORTCUT";
我怀疑可能是htc的这个值出现了变化
权限声明
uses-permission android:name=
"com.android.launcher.permission.INSTALL_SHORTCUT"
Intent shortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT"); // 设置属性 shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, "sdjkdsf"); ShortcutIconResource iconRes = Intent.ShortcutIconResource.fromContext(this.getApplicationContext(), R.drawable.ic_launcher); shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON,iconRes); // 是否允许重复创建 shortcut.putExtra("duplicate", false); //设置桌面快捷方式的图标 Parcelable icon = Intent.ShortcutIconResource.fromContext(this,R.drawable.ic_launcher); shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,icon); //点击快捷方式的操作 Intent intent = new Intent(Intent.ACTION_MAIN); intent.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY); intent.addCategory(Intent.CATEGORY_LAUNCHER); intent.setClass(ShortcutActivity.this, ShortcutActivity.class); // 设置启动程序 shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent); //广播通知桌面去创建 this.sendBroadcast(shortcut);
删除shortcut的代码和权限声明
uses-permission android:name=
"com.android.launcher.permission.UNINSTALL_SHORTCUT"
Intent shortcut = new Intent("com.android.launcher.action.UNINSTALL_SHORTCUT"); //快捷方式的名称 shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name)); String appClass = this.getPackageName() + "." +this.getLocalClassName(); ComponentName comp = new ComponentName(this.getPackageName(), appClass); shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent(Intent.ACTION_MAIN).setComponent(comp)); sendBroadcast(shortcut);
如果有直接添加shortcut的方法且通用行很好的,希望赐教一下