Android 快捷方式的创建与查询 快捷方式问题大全 获取快捷方式在Launcher数据库中的信息 Failed to find provider info for com.android.la

    /**
     * 创建添加快捷方式
     * 其中需要设置的有:
     * 1. 快捷方式的标题
     * 2. 快捷方式的图标
     * 3. 点击快捷方式后的跳转
     */
    public static void createShortcut(Context context) {
        if(haveShortCut(context,context.getResources().getString(R.string.app_bind_phone_num))){
            APP.showToast("已经创建了快捷方式");
            Toast.makeText(context,"已经创建了快捷方式",Toast.LENGTH_LONG).show();
            return;
        }
// 创建添加快捷方式的Intent
        Intent addIntent = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
// 取得快捷方式的标题
        String title = context.getResources().getString(R.string.app_bind_phone_num);
// 加载快捷方式的图标
        Parcelable icon = Intent.ShortcutIconResource.fromContext(context,  R.drawable.online_bookshelf);

// 创建点击快捷方式后操作Intent,该处当点击创建的快捷方式后,再次启动该程序
//      Intent myIntent = new Intent(context, com.zhangyue.iReader.main.MainActivity.class);
        Intent myIntent=new Intent();
// 设置快捷方式的标题
//      myIntent.setClassName(context,"com.ireader.plug.sdk.MainActivity");
        myIntent.setClassName(context,"com.zhangyue.iReader.main.MainActivity");
        addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, title);
// 设置快捷方式的图标
        addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon);
// 设置快捷方式对应的Intent
        addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, myIntent);
// 发送广播添加快捷方式
        context.sendBroadcast(addIntent);
    }

    public static boolean haveShortCut(Context context,String title){
        boolean isInstallShortcut = false;
        final ContentResolver cr = context.getContentResolver();
// 本人的2.2系统是”com.android.launcher2.settings”,网上见其他的为"com.android.launcher.settings"
//      final String AUTHORITY = "com.android.launcher2.settings";
        final String AUTHORITY = getAuthorityFromPermission(context,"com.android.launcher.permission.READ_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[] { title }, null);// XXX表示应用名称。
        if (c != null && c.getCount() > 0) {
            isInstallShortcut = true;
            System.out.println("已创建");
        }
        return isInstallShortcut;
    }
    public static 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;
    }

我写的这个一定可以运行。创建快捷方式之前先查询有没有,有了Toast告诉用户,没有了,去创建。 查询快捷方式有没有的时候, 关于Launcher的快捷方式信息是 存放在 com.android.launcher的launcher.db的favorites表 中的,所以,创建,查询,删除动作都需要操作到那张表。

可能广大的网友 还会发现还会有部分手机判断是否存在快捷方式的时候信息还是不准确。会出现”Failed to find provider info for com.android.calendar”的error,既不是launcher也不是launcher2,那到底哪里出现了问题了呢?

所以,我们需要去查询provider获取真实的content的uri前缀,这样才能保证查询的时候匹配成功。提供获取真实字串的函数如下:
getAuthorityFromPermission这个方法就是干这个的。

如果你是插件程序,你想要创建快捷方式,那么你的activity一定要是expolde=”true”,不然会提示你手机上没有安装该应用。

原文地址:https://www.cnblogs.com/caoxinyu/p/10568693.html