转载 http://blog.csdn.net/liranke/article/details/23923693

“判断 应用为快捷方式的方法”在很多手机上都无法得到正确的结果,下面,给出了一个解决方法。

1.  原有的判断方法:

/**
 * 判断桌面是否已添加快捷方式
 *
 * @param cx
 * @param titleName
 *            快捷方式名称
 * @return
 */
public static boolean hasShortcut(Context cx) {
    boolean result = false;
    // 获取当前应用名称
    String title = null;
    try {
        final PackageManager pm = cx.getPackageManager();
        title = pm.getApplicationLabel(
                pm.getApplicationInfo(cx.getPackageName(),
                        PackageManager.GET_META_DATA)).toString();
    } catch (Exception e) {
    }

final String uriStr;
    if (android.os.Build.VERSION.SDK_INT < 8) {
        uriStr = "content://com.android.launcher.settings/favorites?notify=true";
    } else {
        uriStr = "content://com.android.launcher2.settings/favorites?notify=true";
    }
    final Uri CONTENT_URI = Uri.parse(uriStr);
    final Cursor c = cx.getContentResolver().query(CONTENT_URI, null,
            "title=?", new String[] { title }, null);
    if (c != null && c.getCount() > 0) {
        result = true;
    }
    return result;
}

2.  分析: 关于以上函数,主要原理在就不详细叙述了,这里,重点说一下为什么会得不到正确结果的原因。

很明显,关键在于uriStr, 由于很多android平台有自身的launcher,并且名称不是上面uriStr 中能够匹配到的,这样就会使得Cursor返回值为空,所以,就得不到用户想要的结果。

3.  解决方法:

关键在于如何得到正确的uriStr中所描述的launcher应用。

如果在adb shell中,用ps查看进程列表的话,就会发现有带launcher的进程名,我们根据这点来重新组装uriStr,就会真正拿到当前系统中的launcher了。

4.  相关代码( 包括升级版 hasShortcut函数):

流程: 获取launcher app name;  如果获取ok,则用这个名称去组装uriStr, 再去调用ContentResolver resolver = context.getContentResolver();

示例:打印桌面快捷方式的app

public static void printDeskShortcutApps(Context context) {

String launcherPkgName = getLauncherPkgName(context);
                if (launcherPkgName == null) {
                     return null;
                }

PackageManager pm = context.getPackageManager();

List<PackageInfo> packs = pm.getInstalledPackages(0);

for (PackageInfo info: packs ) {
                    String lableName = info.applicationInfo.loadLabel(pm).toString();
                    if (hasShortcut(context, lableName, launcherPkgName)) {
                             String pkgName = info.packageName;

Log.i("test", 'pkgName = " + pkgName);

}

}

/*
* 获取launcherApp
*/
private static String getLauncherPkgName(Context context) {
             ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
              List<RunningAppProcessInfo> list = activityManager.getRunningAppProcesses();
              for (RunningAppProcessInfo info: list) {
                    String pkgName = info.processName;
                    if (pkgName.contains("launcher") && pkgName.contains("android")) {
                          RSLog.i(TAG, "launcherPkg =  " + pkgName);
                         return pkgName;
                     }

}
               return null;
}

/**
* 判断是否存在快捷方式(升级版本)
* */
private static boolean hasShortcut(Context context, String lableName,String launcherPkgName) {

String url = "";
       url = "content://" + launcherPkgName + ".settings/favorites?notify=true";

ContentResolver resolver = context.getContentResolver();
       Cursor cursor = resolver.query(Uri.parse(url), null, "title=?",
             new String[] { lableName }, null);

if (cursor == null) {
           if(launcherPkgName.equals("com.android.launcher2"))
{
return false;
}
else {

//针对如果不是com.android.launcher2的情况下 cursor仍然返回空的情况,使用com.android.launcher2再查询一次
url = "content://com.android.launcher2.settings/favorites?notify=true";
cursor = resolver.query(Uri.parse(url), null, "title=?",
new String[] { lableName }, null);
if (cursor == null)
{
return false;
}
}
        }
       if (cursor.getCount()>0) {
             cursor.close();
            return true;
        }else {
            cursor.close();
            return false;
       }
}

这样,得到的结果就正确了。

判断应用是否存在快捷方式的方法在很多手机上都无法得到正确的结果的解决办法相关推荐

  1. 如何判断你的数据集是否适合使用深度学习模型?如果数据量太小有什么解决办法?

    如何判断你的数据集是否适合使用深度学习模型?如果数据量太小有什么解决办法? deep learning is a data hungry problem 数据集太小,数据样本不足时,深度学习相对其它机 ...

  2. android执行lua脚本的方法,在Android手机上编写并运行Lua脚本

    利用开源项目SL4A ( Scripting Layer for Android 项目地址:http://code.google.com/p/android-scripting/ ) ,能够快速在An ...

  3. Colab使用方法,以及读取Google drive中的文件太慢的解决办法(亲测有效)

    前言:使用云端硬盘和Colab得能科学上网啊,fq方法自己去摸索吧(捂嘴笑 回到正文!!!! 一.文件上传到Google的云端硬盘上 1.点击左上角的新建 2.点击上传文件或者上传文件即可上传:上传会 ...

  4. 手机无线打不开网络连接到服务器,melogin.cn手机上打不开 melogin·cn打开界面解决方法...

    原标题:"melogin.cn手机上打不开的解决方法"的相关melogincn路由器设置教程资料分享.- 来源:191路由网. Mercury水星MW4530R双频无线路由器WDS ...

  5. Word转pdf一个方法就可以完成~手机电脑都可以免费使用~办公必备

    我们有时编辑完Word文件需要打印或发送给他人查看,一般会先转换为PDF格式,这样在别的电脑上打开时就不会出现格式的变动,也不会出现因为版本而无法打开的问题,那么用什么方法可以将Word转换成PDF文 ...

  6. 创业冲突的五种解决方法是_当创业合伙人发生冲突时,最好的解决办法看这5招...

    原标题:当创业合伙人发生冲突时,最好的解决办法看这5招 小编今天与各位创业的合伙人和高管分享一位朋友的经历,然后根据其经历得出来的一篇文章:创业是一段漫长的旅程.现实中创业者往往会费尽力气,在茫茫人海 ...

  7. UG/NX二次开发 判断圆柱面是不是孔的方法

    文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: 分享一种判断圆柱面是不是孔的方法. 如下图所示体上有三个圆柱面,2个孔和1个R角面. ...

  8. 判断两条轨迹的相似性方法

    判断两条轨迹的相似性方法有很多基于点方法: EDR,LCSS,DTW等基于形状的方法: Frechet, Hausdorff基于分段的方法:One Way Distance, LIP distance ...

  9. AutoCAD 2020安装失败(错误代码:1603)的解决方法/对于Autodesk系列产品都有效

    AutoCAD 2020安装失败(错误代码:1603) 这个解决方法对于Autodesk系列产品都有效 在官网找到的解决方法: 解决方案: 要处理此错误消息,请执行以下步骤: 1.找到这个文件夹C\P ...

最新文章

  1. OpenStack配置虚拟机vcpu绑定步骤 转至元数据结尾
  2. IAR 中打多个断点出现 one or more breakpoints coule not be set and have been disabled原因及解决方案
  3. 长沙理工大学校园网客户端无法卸载解决办法
  4. 另存为里面没有jpg_CAD图不会转JPG?教你两个方法,从此CAD格式转换不再烦恼
  5. vue 自定义组件 v-model
  6. python(源码包安装 基本使用 循环)
  7. RabbitMQ学习之Work Queues(2)
  8. 待更新内容mongodb
  9. 页游游戏市场发展随笔
  10. 传感器技术-电容式传感器(学习笔记六)
  11. 第八章-数据处理的两个基本问题
  12. php怎么安装ecshop,ECSHOP4.0安装教程【ECSHOP4.0安装流程方法】ECSHOP4.0安装步骤-ECSHOP教程网...
  13. 研究生计算机专业的方向有哪些?
  14. 局域网怎么查看单位摄像头_简单易用,夜里看的更清楚,360新品水滴摄像头夜视版实测...
  15. Zhong__CentOS7安装MySQL5.7数据库
  16. linux 16中文输入法,ubuntu 16.04 下安装并切换搜狗中文输入法
  17. 计算机中64位和32位什么意思?有什么区别?
  18. 【数据挖掘】2022数据挖掘之数据的高级处理(消除缺失值、数据离散化、合并等)
  19. 计算机安全沙箱,360安全浏览器沙箱使用说明
  20. 2018年安卓应用市场上架方法

热门文章

  1. 数理逻辑 —— 德摩根定律
  2. django框架之路由层 视图层......
  3. vue与java连接的url_Vue路由器链接在URL中添加对象
  4. vue项目 调用百度地图 BMap is not defined
  5. 如何安装K8s面板工具:kuboard
  6. 校园跑腿小程序搭建(高校接单跑腿平台APP开发思路)
  7. Reactor设计模式详解
  8. Rotated Image
  9. python如何下载bs4库_Python BS4库的安装与使用详解
  10. 内网接口暴露到公网方式