您将获得 ResolveInfo 中的所有必要数据以启动应用程序 . 你可以查看 ResolveInfo javadoc here .
369
这是使用packageManager的更简洁方法
final PackageManager pm = getPackageManager();
//get a list of installed apps.
List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);
for (ApplicationInfo packageInfo : packages) {
Log.d(TAG, "Installed package :" + packageInfo.packageName);
Log.d(TAG, "Source dir : " + packageInfo.sourceDir);
Log.d(TAG, "Launch Activity :" + pm.getLaunchIntentForPackage(packageInfo.packageName));
}
// the getLaunchIntentForPackage returns an intent that you can use with startActivity()
/**
* Return whether the given PackgeInfo represents a system package or not.
* User-installed packages (Market or otherwise) should not be denoted as
* system packages.
*
* @param pkgInfo
* @return
*/
private boolean isSystemPackage(PackageInfo pkgInfo) {
return ((pkgInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0);
}
ArrayList<AppInfo> myAppsToUpdate;
// How to get the system and the user apps.
public ArrayList<AppInfo> getAppsToUpdate() {
PackageManager pm = App.getContext().getPackageManager();
List<ApplicationInfo> installedApps = pm.getInstalledApplications(0);
myAppsToUpdate = new ArrayList<AppInfo>();
for (ApplicationInfo aInfo : installedApps) {
if ((aInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
// System apps
} else {
// Users apps
AppInfo appInfo = new AppInfo();
appInfo.setAppName(aInfo.loadLabel(pm).toString());
appInfo.setPackageName(aInfo.packageName);
appInfo.setLaunchActivity(pm.getLaunchIntentForPackage(aInfo.packageName).toString());
try {
PackageInfo info = pm.getPackageInfo(aInfo.packageName, 0);
appInfo.setVersionName(info.versionName.toString());
appInfo.setVersionCode("" + info.versionCode);
myAppsToUpdate.add(appInfo);
} catch (NameNotFoundException e) {
Log.e("ERROR", "we could not get the user's apps");
}
}
}
return myAppsToUpdate;
}
18
你可以用这个:
PackageManager pm = getApplicationContext().getPackageManager();
List<ResolveInfo> activityList = pm.queryIntentActivities(shareIntent, 0);
for (final ResolveInfo app : activityList)
{
if ((app.activityInfo.name).contains("facebook"))
{
// facebook
}
if ((app.activityInfo.name).contains("android.gm"))
{
// gmail
}
if ((app.activityInfo.name).contains("mms"))
{
// android messaging app
}
if ((app.activityInfo.name).contains("com.android.bluetooth"))
{
// android bluetooth
}
}
54
public static List<ApplicationInfo> getApplications(Context context) {
return context.getPackageManager().getInstalledApplications(PackageManager.GET_META_DATA);
}
17 回答
以下是获取Android上安装的活动/应用程序列表的代码:
您将获得
ResolveInfo
中的所有必要数据以启动应用程序 . 你可以查看ResolveInfo
javadoc here .这是使用packageManager的更简洁方法
更多信息在这里http://qtcstation.com/2011/02/how-to-launch-another-app-from-your-app/
过滤系统应用程序的另一种方法(使用上面的示例):
这是一个很好的例子:
Getting list of installed non-system apps
要过滤基于系统的应用:
要获得已安装的应用程序,您可以使用包管理器..
要运行,您可以使用包名称
有关更多详细信息,请阅读此博客http://codebucket.co.in/android-get-list-of-all-installed-apps/
您可以使用以下代码在Android设备中查找已安装应用程序的列表,“packageInfo”包含设备中已安装的应用程序信息 . 我们可以为从packageinfo对象安装的应用程序检索Intent并使用startactivity(intent),可以启动应用程序 . 您可以通过Listview或Gridview来组织UI . 所以基于位置的点击事件,您可以检索意图对象并启动活动意图 .
如果一个包中有多个启动器,则代码出现问题 . 例如:在用于LG的LG Optimus Facebook,用于LG的MySpace,用于LG的Twitter包含一个包名称SNS,如果您使用上面的SNS将重复 . 经过几个小时的研究,我得到了以下代码 . 似乎运作良好 .
@Jas:我已经没有那个代码了,但我发现了一些接近的东西 . 我已经这样做来搜索我的应用程序的“组件”,它们只是具有给定类别的活动 .
我已经评论了它获取活动名称的部分,但它非常简单 .
我需要过滤掉用户并不真正使用的系统应用程序(例如“com.qualcomm.service”,“update services”等) . 最后,我添加了另一个条件来过滤应用列表 . 我刚检查了该应用是否具有'启动器意图' .
所以,结果代码看起来像......
清洁解决方案,成功过滤掉系统应用程序
这个解决方案背后的想法是每个系统应用程序的主要活动没有自定义活动图标 . 这种方法给了我一个很好的结果:
获取所有应用:
检查安装的应用程序是否打开:
我有另一个解决方案:
你可以用这个: