通过PackageInfo 能获取到哪些信息

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过PackageInfo 能获取到哪些信息相关的知识,希望对你有一定的参考价值。

通过PackageManager可以得到PackageInfo,通过PackageInfo就可以得到你手机上安装的应用的包名(这个很简单,网上有的是,不赘述)。关键是下一步,代码如下(也是a应用中Button的onclick中的代码):
PackageManager packageManager =getPackageManager();
Intent intent=new Intent();
try
intent =packageManager.getLaunchIntentForPackage("要调用应用的包名");
catch (NameNotFoundException e)
Log.i(TAG, e.toString());

startActivity(intent);
其中,"要调用应用的包名"为通过PackageInfo得到的想要启动的应用的包名。这样,我们就可以不知道别人应用源码的情况下,也可以调用别人的应用程序。
众所周知,通过PackageManager可以获取手机端已安装的apk文件的信息,具体代码如下
PackageManager packageManager = this.getPackageManager();
List<PackageInfo> packageInfoList = packageManager.getInstalledPackages(0);
通过以上方法,可以得到手机中安装的所有应用程序,既包括了手动安装的apk包的信息,也包括了系统预装的应用软件的信息,要区分这两类软件可使用以下方法:
a.从packageInfoList获取的packageInfo,再通过packageInfo.applicationInfo获取applicationInfo。
b.判断(applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)的值,该值大于0时,表示获取的应用为系统预装的应用,反之则为手动安装的应用。
大家可以看下代码,说明已经写在注释中。
[java] view plaincopyprint?

/**
* 查询手机内非系统应用
* @param context
* @return
*/
public static List<PackageInfo> getAllApps(Context context)
List<PackageInfo> apps = new ArrayList<PackageInfo>();
PackageManager pManager = context.getPackageManager();
//获取手机内所有应用
List<PackageInfo> paklist = pManager.getInstalledPackages(0);
for (int i = 0; i < paklist.size(); i++)
PackageInfo pak = (PackageInfo) paklist.get(i);
//判断是否为非系统预装的应用程序
if ((pak.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) <= 0)
// customs applications
apps.add(pak);


/** * 查询手机内非系统应用 * @param context * @return */ public static List<PackageInfo> getAllApps(Context context) List<PackageInfo> apps = new ArrayList<PackageInfo>(); PackageManager pManager = context.getPackageManager(); //获取手机内所有应用 List<PackageInfo> paklist = pManager.getInstalledPackages(0); for (int i = 0; i < paklist.size(); i++) PackageInfo pak = (PackageInfo) paklist.get(i); //判断是否为非系统预装的应用程序 if ((pak.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) <= 0) // customs applications apps.add(pak); [java] view plaincopyprint?


return apps;


return apps; [java] view plaincopyprint?

//获取应用名称和图片

//获取应用名称和图片[java] view plaincopyprint?

<PRE class=java name="code">itemInfo.drawable =pak.applicationInfo.loadIcon(getPackageManager());
itemInfo.text = pak.applicationInfo.loadLabel(getPackageManager()).toString(); </PRE><PRE class=java name="code">//也可以这们</PRE><PRE class=java name="code">getPackageManager().getApplicationIcon(pak.applicationInfo);</PRE><PRE class=java name="code">getPackageManager().getApplicationLabel(pak.applicationInfo);
</PRE><PRE class=java name="code">/**
* 查询手机内所有支持分享的应用
* @param context
* @return
*/
public static List<ResolveInfo> getShareApps(Context context)
List<ResolveInfo> mApps = new ArrayList<ResolveInfo>();
Intent intent=new Intent(Intent.ACTION_SEND,null);
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setType("text/plain");
PackageManager pManager = context.getPackageManager();
mApps = pManager.queryIntentActivities(intent,PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
return mApps;

</PRE><BR>
<PRE></PRE>
<PRE class=java name="code"> </PRE>
<P style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 1em; COLOR: rgb(109,109,109); LINE-HEIGHT: 26px; PADDING-TOP: 0px">
<STRONG><SPAN style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; LINE-HEIGHT: 19px; PADDING-TOP: 0px; FONT-FAMILY: mceinline">通过 ResolveInfo 获取具体信息方法:</SPAN><BR>
</STRONG></P>
<P style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 1em; COLOR: rgb(109,109,109); LINE-HEIGHT: 26px; PADDING-TOP: 0px">
包名获取方法:<SPAN style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; LINE-HEIGHT: 19px; PADDING-TOP: 0px">resolve.activityInfo.packageName</SPAN></P>
<P style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 1em; COLOR: rgb(109,109,109); LINE-HEIGHT: 26px; PADDING-TOP: 0px">
<SPAN style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; LINE-HEIGHT: 19px; PADDING-TOP: 0px">icon</SPAN>获取获取方法:<SPAN style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; LINE-HEIGHT: 19px; PADDING-TOP: 0px">resolve.loadIcon(packageManager)</SPAN></P>
<P style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 1em; COLOR: rgb(109,109,109); LINE-HEIGHT: 26px; PADDING-TOP: 0px">
应用名称获取方法:<SPAN style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; LINE-HEIGHT: 19px; PADDING-TOP: 0px">resolve.loadLabel(packageManager).toString()</SPAN></P>
<P> </P>
参考技术A 1.不知道别人应用源码的情况下,如何调用别人的应用程序:
通过PackageManager可以得到PackageInfo,通过PackageInfo就可以得到你手机上安装的应用的包名(这个很简单,网上有的是,不赘述)。关键是下一步,代码如下(也是a应用中Button的onclick中的代码):
PackageManager packageManager =getPackageManager();
Intent intent=new Intent();
try
intent =packageManager.getLaunchIntentForPackage("要调用应用的包名");
catch (NameNotFoundException e)
Log.i(TAG, e.toString());

startActivity(intent);
其中,"要调用应用的包名"为通过PackageInfo得到的想要启动的应用的包名。这样,我们就可以不知道别人应用源码的情况下,也可以调用别人的应用程序。

众所周知,通过PackageManager可以获取手机端已安装的apk文件的信息,具体代码如下
PackageManager packageManager = this.getPackageManager();
List<PackageInfo> packageInfoList = packageManager.getInstalledPackages(0);
通过以上方法,可以得到手机中安装的所有应用程序,既包括了手动安装的apk包的信息,也包括了系统预装的应用软件的信息,要区分这两类软件可使用以下方法:
a.从packageInfoList获取的packageInfo,再通过packageInfo.applicationInfo获取applicationInfo。
b.判断(applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)的值,该值大于0时,表示获取的应用为系统预装的应用,反之则为手动安装的应用。
大家可以看下代码,说明已经写在注释中。
[java] view plaincopyprint?

/**
* 查询手机内非系统应用
* @param context
* @return
*/
public static List<PackageInfo> getAllApps(Context context)
List<PackageInfo> apps = new ArrayList<PackageInfo>();
PackageManager pManager = context.getPackageManager();
//获取手机内所有应用
List<PackageInfo> paklist = pManager.getInstalledPackages(0);
for (int i = 0; i < paklist.size(); i++)
PackageInfo pak = (PackageInfo) paklist.get(i);
//判断是否为非系统预装的应用程序
if ((pak.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) <= 0)
// customs applications
apps.add(pak);


/** * 查询手机内非系统应用 * @param context * @return */ public static List<PackageInfo> getAllApps(Context context) List<PackageInfo> apps = new ArrayList<PackageInfo>(); PackageManager pManager = context.getPackageManager(); //获取手机内所有应用 List<PackageInfo> paklist = pManager.getInstalledPackages(0); for (int i = 0; i < paklist.size(); i++) PackageInfo pak = (PackageInfo) paklist.get(i); //判断是否为非系统预装的应用程序 if ((pak.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) <= 0) // customs applications apps.add(pak); [java] view plaincopyprint?


return apps;


return apps; [java] view plaincopyprint?

//获取应用名称和图片

//获取应用名称和图片[java] view plaincopyprint?

<PRE class=java name="code">itemInfo.drawable =pak.applicationInfo.loadIcon(getPackageManager());
itemInfo.text = pak.applicationInfo.loadLabel(getPackageManager()).toString(); </PRE><PRE class=java name="code">//也可以这们</PRE><PRE class=java name="code">getPackageManager().getApplicationIcon(pak.applicationInfo);</PRE><PRE class=java name="code">getPackageManager().getApplicationLabel(pak.applicationInfo);
</PRE><PRE class=java name="code">/**
* 查询手机内所有支持分享的应用
* @param context
* @return
*/
public static List<ResolveInfo> getShareApps(Context context)
List<ResolveInfo> mApps = new ArrayList<ResolveInfo>();
Intent intent=new Intent(Intent.ACTION_SEND,null);
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setType("text/plain");
PackageManager pManager = context.getPackageManager();
mApps = pManager.queryIntentActivities(intent,PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);

return mApps;


</PRE><BR>
<PRE></PRE>
<PRE class=java name="code"> </PRE>
<P style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 1em; COLOR: rgb(109,109,109); LINE-HEIGHT: 26px; PADDING-TOP: 0px">
<STRONG><SPAN style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; LINE-HEIGHT: 19px; PADDING-TOP: 0px; FONT-FAMILY: mceinline">通过 ResolveInfo 获取具体信息方法:</SPAN><BR>
</STRONG></P>
<P style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 1em; COLOR: rgb(109,109,109); LINE-HEIGHT: 26px; PADDING-TOP: 0px">
包名获取方法:<SPAN style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; LINE-HEIGHT: 19px; PADDING-TOP: 0px">resolve.activityInfo.packageName</SPAN></P>
<P style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 1em; COLOR: rgb(109,109,109); LINE-HEIGHT: 26px; PADDING-TOP: 0px">
<SPAN style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; LINE-HEIGHT: 19px; PADDING-TOP: 0px">icon</SPAN>获取获取方法:<SPAN style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; LINE-HEIGHT: 19px; PADDING-TOP: 0px">resolve.loadIcon(packageManager)</SPAN></P>
<P style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 1em; COLOR: rgb(109,109,109); LINE-HEIGHT: 26px; PADDING-TOP: 0px">
应用名称获取方法:<SPAN style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; LINE-HEIGHT: 19px; PADDING-TOP: 0px">resolve.loadLabel(packageManager).toString()</SPAN></P>
<P> </P>

Android获取到手机应用图标并显示在页面上

PackageManager pm = getPackageManager(); // 得到PackageManager对象
// List<ApplicationInfo> packs = pm.getInstalledApplications(0); //
// 得到系统安装的所有程序包的PackageInfo对象
List<PackageInfo> packs = pm.getInstalledPackages(0); // 得到用户安装的所有程序包的PackageInfo对象
for (PackageInfo pi : packs)
map = new HashMap<String, Object>();
// 显示用户安装的应用程序,而不显示系统程序
if ((pi.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0
&& (pi.applicationInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 0)
// 这将会显示所有安装的应用程序,不包括系统应用程序
/**
* 获得文件大小 publicSourceDir获得路径,再通过该路径创建一个文件new File(String dir),
* 得到该文件长度除以1024则取得该应用的大小。
* 取得程序大小,通过application的publicSourceDir获得。
* 取得程序时间,通过application的SourceDir获得。
*/
String dir = pi.applicationInfo.publicSourceDir;
int size = Integer.valueOf((int) new File(dir).length());
long date = new Date(new File(dir).lastModified()).getTime();
map.put("appName", pi.applicationInfo.loadLabel(pm));// 应用程序名称
map.put("icon", pi.applicationInfo.loadIcon(pm));// 图标
map.put("versionName", "版本 :" + pi.versionName);// 应用程序版本\
map.put("appSize2", size);// 应用程序大小
map.put("packages", pi.applicationInfo.packageName); // 应用程序包名
map.put("appSize", "大小 :" + ToSzie(size));// 应用程序大小
map.put("appDate", date);// 应用程序时间
items.add(map);



启动 :

String path ="package:"+v.getTag();
Uri packageURI = Uri.parse(path);
Intent uninstallIntent = new Intent(this packageURI);
context.startActivity(uninstallIntent);
以上是以为大神写的,我如果要想显示到页面上的话:

SimpleAdapter adapter = new SimpleAdapter(this, list,
R.layout.my_listitem, new String[] "img", "title", "up",
"down", "total" , new int[] R.id.img, R.id.title,
R.id.up, R.id.down, R.id.total );

listView.setAdapter(adapter);
这个方法可否??可是应用程序的图标并不显示啊!!为啥?请问是哪里出错了?
还有就是上面那位大神所写的“启动”是什么意思啊??

参考技术A 你那几个R.id.img,R.id.up都是些什么啊,pi.applicationInfo.loadIcon(pm)这个拿到图标的drawable然后你显示出来就是了,启动 就是启动这个应用, 参考技术B 楼主的意思是菜单上的应用移到手机界面上???追问

是的,不过问题已解决。

参考技术C LZ能告诉怎么解决的么?正在搞这块 drawable得到了,怎么显示在页面〉?
PS:能告诉一下吧 435159281@qq.com 直接qq也行

以上是关于通过PackageInfo 能获取到哪些信息的主要内容,如果未能解决你的问题,请参考以下文章

Android获取桌面应用程序

android获取系统版本号

android开发应用版本升级怎么实现

Android获取到手机应用图标并显示在页面上

php,js等,能通过浏览器取得访问者的mac地址吗?还能取得客户的哪些信息?

我的手机管家(15) 缓存处理 逻辑代码