zoukankan      html  css  js  c++  java
  • android 获取非系统应用

    引用:http://www.cnblogs.com/mainroadlee/archive/2011/05/23/android_get_installed_app.html

    Android 菜市场上有一款应用较 ShareApp,可以显示,管理,分享Android手机上安装的应用。

    但比较不爽的是,它把很多系统自带的应用程序也都显示了出来。这些程序往往是无法卸载的,更无法分享,让“已安装应用程序”的列表显的非常凌乱。

    我在手机上运行了一下,结果Gtalk,DRMService这些系统应用都显示出来了..比较不爽。

    于是自己写了个程序,看看能不能只显示用户自己安装的程序。

    程序大概分成三个部分:

    1.获取手机已安装的所有应用package的信息(其中包括用户自己安装的,还有系统自带的);

    2.滤除系统自带应用;

    3.通过列表显示出应用程序的图标(icon),和其他文字信息(应用名称,包名称package name,版本号等等)

    首先,我们定义一个数据结构,来保存应用程序信息(icon,name,packageName,versionName,versionCode,等)

    复制代码
    publicclass AppInfo {
    public String appName="";
    public String packageName="";
    public String versionName="";
    publicint versionCode=0;
    public Drawable appIcon=null;
    publicvoid print()
    {
    Log.v(
    "app","Name:"+appName+" Package:"+packageName);
    Log.v(
    "app","Name:"+appName+" versionName:"+versionName);
    Log.v(
    "app","Name:"+appName+" versionCode:"+versionCode);
    }

    }
    复制代码

    然后我们通过PackageManager 来获取已安装的应用包信息。

    复制代码
         ArrayList<AppInfo> appList = new ArrayList<AppInfo>(); //用来存储获取的应用信息数据
         List<PackageInfo> packages = getPackageManager().getInstalledPackages(0);

    for(int i=0;i<packages.size();i++) {
    PackageInfo packageInfo
    = packages.get(i);
    AppInfo tmpInfo
    =new AppInfo();
    tmpInfo.appName
    = packageInfo.applicationInfo.loadLabel(getPackageManager()).toString();
    tmpInfo.packageName
    = packageInfo.packageName;
    tmpInfo.versionName
    = packageInfo.versionName;
    tmpInfo.versionCode
    = packageInfo.versionCode;
    tmpInfo.appIcon
    = packageInfo.applicationInfo.loadIcon(getPackageManager());
    appList.add(tmpInfo);

    }
    //好啦 这下手机上安装的应用数据都存在appList里了。
    复制代码

    那么如何判断一个应用是否为系统应用呢?

    复制代码
    if((packageInfo.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM)==0)
    {
    //非系统应用
    }
    else
    {
    //系统应用        
    }
    复制代码

    所以如果只需要获取到非系统应用信息,代码如下:

    复制代码
    ArrayList<AppInfo> appList = new ArrayList<AppInfo>(); //用来存储获取的应用信息数据
    List<PackageInfo> packages = getPackageManager().getInstalledPackages(0);

    for(int i=0;i<packages.size();i++) {
    PackageInfo packageInfo
    = packages.get(i);
    AppInfo tmpInfo
    =new AppInfo();
    tmpInfo.appName
    = packageInfo.applicationInfo.loadLabel(getPackageManager()).toString();
    tmpInfo.packageName
    = packageInfo.packageName;
    tmpInfo.versionName
    = packageInfo.versionName;
    tmpInfo.versionCode
    = packageInfo.versionCode;
    tmpInfo.appIcon
    = packageInfo.applicationInfo.loadIcon(getPackageManager());
    //Only display the non-system app info
    if((packageInfo.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM)==0)
    {
    appList.add(tmpInfo);//如果非系统应用,则添加至appList
    }

    }
    复制代码

    最后,我们可以自定义一个app_row.xml的layout 文件,用来显示appList中的数据

    是不是看着利索多了~~~(我在每行里只显示了icon 和 appName,你也可以修改app_row.xml 和 AppAdapter 部分后显示更多的信息)

    大家可以参考我的源码:

    源码下载地址:
    http://www.everbox.com/f/cV98GFipIUHV34WOmXNdemQ6Vm 

    我的联系方式:

    twitter: @mainroadlee 

    http://twitter.com/#!/mainroadlee

    talkbox id:mainroadlee

     

    参考:

    1. [Android分享] Android 得到已安装的应用程序信息 

    http://www.eoeandroid.com/thread-67948-1-1.html

    该文中描述了如何获取Android 已安装应用信息,但关于系统应用的判断部分存在错误。

    2. Android中级篇之区分系统程序和安装程序

    http://blog.csdn.net/y13872888163/archive/2011/05/20/6435618.aspx

  • 相关阅读:
    gc buffer busy/gcs log flush sync与log file sync
    给Oracle年轻的初学者的几点建议
    Android 编程下帧动画在 Activity 启动时自动运行的几种方式
    Android 编程下 Touch 事件的分发和消费机制
    Java 编程下 static 关键字
    Java 编程下 final 关键字
    Android 编程下模拟 HOME 键效果
    Why Are Thread.stop, Thread.suspend, Thread.resume and Runtime.runFinalizersOnExit Deprecated ?
    Extjs4 大型项目目录结构重构
    [转]SQLServer 2008 允许远程连接的配置方法
  • 原文地址:https://www.cnblogs.com/sode/p/2615845.html
Copyright © 2011-2022 走看看