• 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”,不然会提示你手机上没有安装该应用。

  • 相关阅读:
    C++封装SQLite实例<六>
    大哥给力点 我要发博客
    Android仿人人客户端(v5.7.1)——授权认证(用accessToken换取session_key、session_secret和userId)
    三阶魔方玩法总结
    二阶魔方玩法
    [置顶] C语言实验:等额本金还款法的计算
    活到老、学到老,我要做80岁还能写代码的奇葩!
    百度PHP电话面试之十问
    Java 面向对象编程思想类及其方法的调用,分解质因数,界面交互方法 int string 类型转换 陈光剑
    [置顶] C语言实验:输入任意一个日期的年、月、日的值,求出从公元1年1月1日到这一天总共有多少天,并求出这一天是星期几。
  • 原文地址:https://www.cnblogs.com/caoxinyu/p/10568692.html
Copyright © 2020-2023  润新知