美文网首页
获取被禁用的应用

获取被禁用的应用

作者: w小强 | 来源:发表于2019-06-03 23:23 被阅读0次

    title: 获取被禁用的应用
    date: 2016-11-19 15:41:56
    tags: function
    categories: android


    功能开发

    需求

    1、问题

        在开发APP分享功能,使用ShareSDK 完成微信、朋友圈、QQ和QQ空间的分享。产品要求在手机上没有安装微信和QQ时,
    给出提示未安装这些应用。
        但是在三星一款手机上,系统内置微信应用。所以微信是不能卸载的,但是可以直接禁用这个应用。由此出现提示不准确问题。
    

    2、需求

        除去检查APP是否被安装以外,还需要检查APP是否被禁用。如果被禁用那样同样提示用户没有安装这个应用。
    

    解决过程

    遇到这个问题,我首先想到的时候这个禁用是Android系统自带的功能还是三星自己定制的功能。
    最后发现这个在其他手机上也有,不过需要你从应用信息中去停用,而不是像三星那样,在删除的时候可以直接选择停用。
    Android系统支持的功能,那么在API中就有说明。如此,我直接找API文档。
    第一反应到PackageInfo中寻找答案。通过测试以及看文档,发现这个中并没有关于应用是否被警用的信息。
    然后寻找其他的info,发现都没有相关的属性。难道是我想错了?
    我的理解是禁用功能应该是对某个APP增加一个标识,那么这个标识不是最应该保持在想关的包信息中的么?
    经过一番折腾,我又去看PackageManager。禁用的描述信息真好在这里可以获取到。看来我对PackageManager和PackageInfo的理解还是有误。
    在PackageManager中有一下三个信息:
    
    COMPONENT_ENABLED_STATE_DEFAULT//默认开启状态
    COMPONENT_ENABLED_STATE_DISABLED//已被明确禁用
    COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED//没有理解这个含义
    COMPONENT_ENABLED_STATE_DISABLED_USER//用户已明确禁用应用程序
    COMPONENT_ENABLED_STATE_ENABLED//明确指定启用??
    

    它们都对应setApplicationEnabledSetting(String, int, int)方法。既然能set,那么应该会有相应的get方法。去获取就行了

    解决方法

    相应的代码如下

    final PackageManager packageManager = context.getPackageManager();// 获取packagemanager
             List<PackageInfo> pinfo = packageManager.getInstalledPackages(0);// 获取所有已安装程序的包信息
             if (pinfo != null) {
                   for (int i = 0; i < pinfo.size(); i++) {  
                       String pn = pinfo.get(i).packageName;  
                       if (pn.equals("com.tencent.mm")) {
                           if(packageManager.getApplicationEnabledSetting("com.tencent.mm") ==  PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER){
                               return false;
                           }
                           return true;  
                       }
                   }  
               }  
               return false; 
    

    注意事项

    之后在测试中,又发现一个BUG,原因是我在判断QQ是同时判断了com.tencent.mobileqq或com.tencent.qqlite中有一个存在,
    那么就去判断这两个是否有一个不可用。
    结果getApplicationEnabledSetting出现异常,导致程序崩溃。
    所以在使用getApplicationEnabledSetting方法时,必须保证这个APP在手机中是存在的,如此才可以
    进行禁用的判断!
    

    相关文章

      网友评论

          本文标题:获取被禁用的应用

          本文链接:https://www.haomeiwen.com/subject/tdkkxctx.html