快捷键的生成、删除、判断 那些方法 原生的系统一般木有问题 第三方rom 就会存在 适配问题
一、权限:
1、manifest 文件中 添加权限
- <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/>
- <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT"/>
- </pre>下面就是关于这个权限 <p></p><p></p><pre name="code" class="html">com.android.launcher.permission.READ_SETTINGS
不同版本 不同的机型 添加的不同
Build.VERSION.SDK_INT < 8 :
- com.android.launcher.permission.READ_SETTINGS
Build.VERSION.SDK_INT < 19 :
- com.android.launcher2.permission.READ_SETTINGS
Build.VERSION.SDK_INT >=19 :
- com.android.launcher3.permission.READ_SETTINGS
以华为为例 就需要 添加
- uses-permission android:name="com.huawei.android.launcher.permission.READ_SETTINGS"/>
- <uses-permission android:name="com.huawei.android.launcher.permission.WRITE_SETTINGS"/>
否则在下面的判断的方法里会报错出现
- java.lang.SecurityException: Permission Denial:
- opening provider com.huawei.android.launcher.LauncherProvider from ProcessRecord (pid=17220, uid=10150)
- requires com.huawei.android.launcher.permission.READ_SETTINGS or com.huawei.android.launcher.permission.WRITE_SETTINGS
这里列出大部分的平牌机对应的相应权限
- <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.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.lenovo.launcher.permission.READ_SETTINGS"/>
- <uses-permission android:name="com.lenovo.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"/>
二、provider.authority为null的问题
- public boolean hasShortcut(Context context, String shortCutName)
- {
- boolean has = false;
- final ContentResolver cr = context.getContentResolver();
- String AUTHORITY = getAuthorityFromPermission(context,
- "com.android.launcher.permission.READ_SETTINGS");
-
- final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY
- + "/favorites?notify=true");
-
- // 确认content Provider中是否有快捷键信息
- Cursor c = cr.query(CONTENT_URI, new String[]
- { "title", "iconResource" }, "title=?", new String[]
- { shortCutName.trim() }, null);
- if (c != null && c.getCount() > 0)
- {
- has = true;
- if (c!=null&&!c.isClosed())
- {
- c.close();
- }
- }
- return has;
- }
- private String getAuthorityFromPermission(Context context,
- String permission)
- {
- if (permission == null)
- return null;
- List<PackageInfo> packs = context.getPackageManager()
- .getInstalledPackages(PackageManager.GET_PROVIDERS);
- if (packs != null)
- {
- for (PackageInfo pack : packs)
- {
- ProviderInfo[] providers = pack.providers;
- if (providers != null)
- {
- for (ProviderInfo provider : providers)
- {
- if (permission.equals(provider.readPermission))
- return provider.authority;
- if (permission.equals(provider.writePermission))
- return provider.authority;
- }
- }
- }
- }
-
- return null;
- }
通常写法 应该是这样 或者再加入这些代码:
- if (TextUtils.isEmpty(AUTHORITY))
- {
- int sdkInt = 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";
- }
- }
但对第三方rom来说 好像还是行不通 权限值虽然取到了 这样得到的uri 对应的cursor 依然为空 看来权限并没有获取 正确 。通过对provideInfo的遍历 我发现后缀字符串为"launcher.permission.READ_SETTINGS" 日志过滤出的权限只有一个 并且正是我想要的。以下是我对获取权限方法的些许改动
- private String getAuthorityFromPermission(Context context)
- {
- List<PackageInfo> packs = context.getPackageManager()
- .getInstalledPackages(PackageManager.GET_PROVIDERS);
- if (packs != null)
- {
- for (PackageInfo pack : packs)
- {
- ProviderInfo[] providers = pack.providers;
- if (providers != null)
- {
- for (ProviderInfo provider : providers)
- {
-
- //"launcher.permission.READ_SETTINGS" 规律总结 不见得适配所有 需要测试
- if (!TextUtils.isEmpty(provider.readPermission)&&provider.readPermission.contains("launcher.permission.READ_SETTINGS"))
- {
- return provider.authority;
- }
- }
- }
- }
- }
-
- return null;
- }
三 、创建快捷方式 点击进入相应的程序或界面
- public void addShortCut(Context mContext)
- {
- Intent shortcut = new Intent(
- "com.android.launcher.action.INSTALL_SHORTCUT");
- shortcut.putExtra("duplicate", false);
- shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, mContext.getResources()
- .getString(R.string.str_shortCutName));
- Parcelable shortcutIcon = Intent.ShortcutIconResource.fromContext(
- mContext, R.drawable.icon_shortcut);
- shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, shortcutIcon);
-
- Intent intent = new Intent();
- // ComponentName comp = new ComponentName(mContext.getPackageName(),
- // mContext.getPackageName() + ".ui.xx."
- // + IntentTargetClass.class.getSimpleName());
-
- intent.setAction(Intent.ACTION_MAIN);
- intent.addCategory(Intent.CATEGORY_LAUNCHER);
- intent.setClass(mContext, IntentTargetClass.class);
- // intent.setComponent(comp);
- shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent);
- mContext.sendBroadcast(shortcut);
-
- }
通常都没有问题 但个别版本 个别第三方又会出现 虽然出现了创建xxx 快捷方式的提醒 但是 手机桌面并没有快捷图标的出现
这个时候 我把不重复创建的设置 置为true 是否已有创建 需要根据 快捷方式是否已经存在进行判断
- shortcut.putExtra("duplicate", true);
另外 有的快捷方式虽已出现 但是点击快捷方式 并没有进入 我们想要进入的界面 activity
在该activity的声明里 加入 intent_filter
- <intent-filter >
- <action android:name="android.intent.action.CREATE_SHORTCUT"/>
- </intent-filter>
大部分情况下都是ok了 但时仍有个别 快捷方式 图标显示正确 但是 名称并没有显示出我们赋予的 shortcutName 而是显示 app_name 例如 LG部分机型
这个问题没有解决 希望有大神 能帮助解答
本文 属于 只知其一不知其二 的尝试解决方式 很希望 那些看Launcher 模块源码的大神们 能分享指点一二
如有错误 欢迎指正
|