我可以在Intent.CATEGORY_LAUNCHER
的帮助下获取Launcher中的所有应用程序。
因此,为了测试我创建了一个测试活动,这个活动包含一个按钮,如果按下按钮,它应该在设备中显示应用程序
NOTE: `it should not display specific. for example i needed only Browser it should display all browser applications.`
我用这种方式尝试了一个小代码:
btn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_APP_BROWSER);
List<ResolveInfo> mainLauncherList = getPackageManager().queryIntentActivities(intent, 0);
System.out.println("the list iss = " +mainLauncherList);
}
});
该列表只返回一个浏览器,即单个浏览器。
答案 0 :(得分:6)
而不是类别,给意图一个动作并查询可以ACTION_VIEW
一个网址的动作,如下所示:
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.google.com"));
List<ResolveInfo> mainLauncherList = getPackageManager().queryIntentActivities(intent, 0);
Log.e("Browsers","the list iss = " +mainLauncherList);
返回类似的内容:
[ResolveInfo{44e9d350 com.android.browser.BrowserActivity p=0 o=0 m=0x208000}]
假设您安装了多个浏览器,它将全部包含它们。也许我误解了你的问题,但如果你试图启动打开网址的意图,这在技术上会返回你会得到的相同应用程序。
关于获取这些应用程序的启动程序活动,因为您已经知道如何获取所有主要应用程序,并且通过我给出的代码,您所使用的代码,您可以匹配程序包名称(可以说)以找到发射器一(?)
<强>更新强>
ArrayList<String> allLaunchers = new ArrayList<String>();
Intent allApps = new Intent(Intent.ACTION_MAIN);
List<ResolveInfo> allAppList = getPackageManager().queryIntentActivities(allApps, 0);
for(int i =0;i<allAppList.size();i++) allLaunchers.add(allAppList.get(i).activityInfo.packageName);
Intent myApps = new Intent(Intent.ACTION_VIEW);
myApps.setData(Uri.parse("http://www.google.es"));
List<ResolveInfo> myAppList = getPackageManager().queryIntentActivities(myApps, 0);
for(int i =0;i<myAppList.size();i++){
if(allLaunchers.contains(myAppList.get(i).activityInfo.packageName)){
Log.e("match",myAppList.get(i).activityInfo.packageName+"");
}
}
正如我所说,你从发射器获得所有包裹,并将它们与能够执行动作的包裹相匹配,无论是拍照还是浏览网页。你应该能够解决这个问题。
答案 1 :(得分:0)
如果有其他人需要答案:
public static void getBrowserApps(Context mcontext) {
PackageManager packageManager = mcontext.getPackageManager();
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.google.com"));
List<ResolveInfo> list = packageManager.queryIntentActivities(intent,
PackageManager.MATCH_ALL);}
list
将包含所有浏览器的包信息。
答案 2 :(得分:0)
在 API 版本 30 之上,我需要向 AndroidManifest.xml 添加一个 queries
部分,因为新的 package visibility rules(除了上面提到的使用 PackageManager.MATCH_ALL
之外)。
<manifest ...>
<application ... />
<queries>
<intent>
<action android:name="android.intent.action.VIEW" />
<data android:scheme="http" />
</intent>
</queries>
</manifest>