[转载]Android获取已安装应用信息(图标,名称,版本号,包) – MainRoad – 博客园.
Android 菜市场上有一款应用较 ShareApp,可以显示,管理,分享Android手机上安装的应用。
但比较不爽的是,它把很多系统自带的应用程序也都显示了出来。这些程序往往是无法卸载的,更无法分享,让“已安装应用程序”的列表显的非常凌乱。
我在手机上运行了一下,结果Gtalk,DRMService这些系统应用都显示出来了..比较不爽。
于是自己写了个程序,看看能不能只显示用户自己安装的程序。
程序大概分成三个部分:
1.获取手机已安装的所有应用package的信息(其中包括用户自己安装的,还有系统自带的);
2.滤除系统自带应用;
3.通过列表显示出应用程序的图标(icon),和其他文字信息(应用名称,包名称package name,版本号等等)
首先,我们定义一个数据结构,来保存应用程序信息(icon,name,packageName,versionName,versionCode,等)
<span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > class </span><span class = "pln" > </span><span class = "typ" >AppInfo</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "typ" >String</span><span class = "pln" > appName</span><span class = "pun" >=</span><span class = "str" > "" </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "typ" >String</span><span class = "pln" > packageName</span><span class = "pun" >=</span><span class = "str" > "" </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "typ" >String</span><span class = "pln" > versionName</span><span class = "pun" >=</span><span class = "str" > "" </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > versionCode</span><span class = "pun" >=</span><span class = "lit" > 0 </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "typ" >Drawable</span><span class = "pln" > appIcon</span><span class = "pun" >=</span><span class = "kwd" > null </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > </span><span class = "kwd" >print</span><span class = "pun" >()</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "typ" >Log</span><span class = "pun" >.</span><span class = "pln" >v</span><span class = "pun" >(</span><span class = "str" > "app" </span><span class = "pun" >,</span><span class = "str" > "Name:" </span><span class = "pun" >+</span><span class = "pln" >appName</span><span class = "pun" >+</span><span class = "str" > " Package:" </span><span class = "pun" >+</span><span class = "pln" >packageName</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "typ" >Log</span><span class = "pun" >.</span><span class = "pln" >v</span><span class = "pun" >(</span><span class = "str" > "app" </span><span class = "pun" >,</span><span class = "str" > "Name:" </span><span class = "pun" >+</span><span class = "pln" >appName</span><span class = "pun" >+</span><span class = "str" > " versionName:" </span><span class = "pun" >+</span><span class = "pln" >versionName</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "typ" >Log</span><span class = "pun" >.</span><span class = "pln" >v</span><span class = "pun" >(</span><span class = "str" > "app" </span><span class = "pun" >,</span><span class = "str" > "Name:" </span><span class = "pun" >+</span><span class = "pln" >appName</span><span class = "pun" >+</span><span class = "str" > " versionCode:" </span><span class = "pun" >+</span><span class = "pln" >versionCode</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span> |
然后我们通过PackageManager 来获取已安装的应用包信息。
<span class = "typ" >ArrayList</span><span class = "pln" > appList </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >ArrayList</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "com" > //用来存储获取的应用信息数据</span><span class="pln"> </span><span class = "typ" >List</span><span class = "pln" > packages </span><span class = "pun" >=</span><span class = "pln" > getPackageManager</span><span class = "pun" >().</span><span class = "pln" >getInstalledPackages</span><span class = "pun" >(</span><span class = "lit" > 0 </span><span class = "pun" >);</span><span class = "pln" > </span><span class = "kwd" > for </span><span class = "pun" >(</span><span class = "kwd" > int </span><span class = "pln" > i</span><span class = "pun" >=</span><span class = "lit" > 0 </span><span class = "pun" >;</span><span class = "pln" >i </span><span class = "typ" >PackageInfo</span><span class = "pln" > packageInfo </span><span class = "pun" >=</span><span class = "pln" > packages</span><span class = "pun" >.</span><span class = "kwd" >get</span><span class = "pun" >(</span><span class = "pln" >i</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "typ" >AppInfo</span><span class = "pln" > tmpInfo </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >AppInfo</span><span class = "pun" >();</span><span class = "pln" > tmpInfo</span><span class = "pun" >.</span><span class = "pln" >appName </span><span class = "pun" >=</span><span class = "pln" > packageInfo</span><span class = "pun" >.</span><span class = "pln" >applicationInfo</span><span class = "pun" >.</span><span class = "pln" >loadLabel</span><span class = "pun" >(</span><span class = "pln" >getPackageManager</span><span class = "pun" >()).</span><span class = "pln" >toString</span><span class = "pun" >();</span><span class = "pln" > tmpInfo</span><span class = "pun" >.</span><span class = "pln" >packageName </span><span class = "pun" >=</span><span class = "pln" > packageInfo</span><span class = "pun" >.</span><span class = "pln" >packageName</span><span class = "pun" >;</span><span class = "pln" > tmpInfo</span><span class = "pun" >.</span><span class = "pln" >versionName </span><span class = "pun" >=</span><span class = "pln" > packageInfo</span><span class = "pun" >.</span><span class = "pln" >versionName</span><span class = "pun" >;</span><span class = "pln" > tmpInfo</span><span class = "pun" >.</span><span class = "pln" >versionCode </span><span class = "pun" >=</span><span class = "pln" > packageInfo</span><span class = "pun" >.</span><span class = "pln" >versionCode</span><span class = "pun" >;</span><span class = "pln" > tmpInfo</span><span class = "pun" >.</span><span class = "pln" >appIcon </span><span class = "pun" >=</span><span class = "pln" > packageInfo</span><span class = "pun" >.</span><span class = "pln" >applicationInfo</span><span class = "pun" >.</span><span class = "pln" >loadIcon</span><span class = "pun" >(</span><span class = "pln" >getPackageManager</span><span class = "pun" >());</span><span class = "pln" > appList</span><span class = "pun" >.</span><span class = "pln" >add</span><span class = "pun" >(</span><span class = "pln" >tmpInfo</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "com" > //好啦 这下手机上安装的应用数据都存在appList里了。</span> |
那么如何判断一个应用是否为系统应用呢?
<span class = "kwd" > if </span><span class = "pun" >((</span><span class = "pln" >packageInfo</span><span class = "pun" >.</span><span class = "pln" >applicationInfo</span><span class = "pun" >.</span><span class = "pln" >flags</span><span class = "pun" >&</span><span class = "pln" >amp</span><span class = "pun" >;</span><span class = "typ" >ApplicationInfo</span><span class = "pun" >.</span><span class = "pln" >FLAG_SYSTEM</span><span class = "pun" >)==</span><span class = "lit" > 0 </span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "com" > //非系统应用</span><span class="pln"> </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > else </span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "com" > //系统应用</span><span class="pln"> </span><span class = "pun" >}</span><span class = "pln" > </span> |
所以如果只需要获取到非系统应用信息,代码如下:
<span class = "typ" >ArrayList</span><span class = "pln" > appList </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >ArrayList</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "com" > //用来存储获取的应用信息数据</span><span class="pln"> </span><span class = "typ" >List</span><span class = "pln" > packages </span><span class = "pun" >=</span><span class = "pln" > getPackageManager</span><span class = "pun" >().</span><span class = "pln" >getInstalledPackages</span><span class = "pun" >(</span><span class = "lit" > 0 </span><span class = "pun" >);</span><span class = "pln" > </span><span class = "kwd" > for </span><span class = "pun" >(</span><span class = "kwd" > int </span><span class = "pln" > i</span><span class = "pun" >=</span><span class = "lit" > 0 </span><span class = "pun" >;</span><span class = "pln" >i </span><span class = "typ" >PackageInfo</span><span class = "pln" > packageInfo </span><span class = "pun" >=</span><span class = "pln" > packages</span><span class = "pun" >.</span><span class = "kwd" >get</span><span class = "pun" >(</span><span class = "pln" >i</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "typ" >AppInfo</span><span class = "pln" > tmpInfo </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >AppInfo</span><span class = "pun" >();</span><span class = "pln" > tmpInfo</span><span class = "pun" >.</span><span class = "pln" >appName </span><span class = "pun" >=</span><span class = "pln" > packageInfo</span><span class = "pun" >.</span><span class = "pln" >applicationInfo</span><span class = "pun" >.</span><span class = "pln" >loadLabel</span><span class = "pun" >(</span><span class = "pln" >getPackageManager</span><span class = "pun" >()).</span><span class = "pln" >toString</span><span class = "pun" >();</span><span class = "pln" > tmpInfo</span><span class = "pun" >.</span><span class = "pln" >packageName </span><span class = "pun" >=</span><span class = "pln" > packageInfo</span><span class = "pun" >.</span><span class = "pln" >packageName</span><span class = "pun" >;</span><span class = "pln" > tmpInfo</span><span class = "pun" >.</span><span class = "pln" >versionName </span><span class = "pun" >=</span><span class = "pln" > packageInfo</span><span class = "pun" >.</span><span class = "pln" >versionName</span><span class = "pun" >;</span><span class = "pln" > tmpInfo</span><span class = "pun" >.</span><span class = "pln" >versionCode </span><span class = "pun" >=</span><span class = "pln" > packageInfo</span><span class = "pun" >.</span><span class = "pln" >versionCode</span><span class = "pun" >;</span><span class = "pln" > tmpInfo</span><span class = "pun" >.</span><span class = "pln" >appIcon </span><span class = "pun" >=</span><span class = "pln" > packageInfo</span><span class = "pun" >.</span><span class = "pln" >applicationInfo</span><span class = "pun" >.</span><span class = "pln" >loadIcon</span><span class = "pun" >(</span><span class = "pln" >getPackageManager</span><span class = "pun" >());</span><span class = "pln" > </span><span class = "com" > //Only display the non-system app info</span><span class="pln"> </span><span class = "kwd" > if </span><span class = "pun" >((</span><span class = "pln" >packageInfo</span><span class = "pun" >.</span><span class = "pln" >applicationInfo</span><span class = "pun" >.</span><span class = "pln" >flags</span><span class = "pun" >&</span><span class = "pln" >amp</span><span class = "pun" >;</span><span class = "typ" >ApplicationInfo</span><span class = "pun" >.</span><span class = "pln" >FLAG_SYSTEM</span><span class = "pun" >)==</span><span class = "lit" > 0 </span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > appList</span><span class = "pun" >.</span><span class = "pln" >add</span><span class = "pun" >(</span><span class = "pln" >tmpInfo</span><span class = "pun" >);</span><span class = "com" > //如果非系统应用,则添加至appList</span><span class="pln"> </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span> |
最后,我们可以自定义一个app_row.xml的layout 文件,用来显示appList中的数据
是不是看着利索多了~~~(我在每行里只显示了icon 和 appName,你也可以修改app_row.xml 和 AppAdapter 部分后显示更多的信息)
大家可以参考我的源码:
源码下载地址:
http://www.everbox.com/f/cV98GFipIUHV34WOmXNdemQ6Vm
我的联系方式:
twitter: @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