5

我能够在Intent.CATEGORY_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);
        }
    });

该列表仅返回一个浏览器,即单个浏览器。

4

3 回答 3

7

代替类别,给意图一个动作并查询可以ACTION_VIEW是 url 的动作,如下所示:

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}]

假设您安装了多个浏览器,它将包含所有浏览器。也许我误解了您的问题,但从技术上讲,如果您尝试启动打开 url 的意图,这会返回相同的应用程序。

至于获取这些应用程序的启动器活动,因为您已经知道如何获取所有主要应用程序,并且通过我提供的代码,您所追求的那个,您可以匹配包名称(大概)以找到启动器之一( ?)

更新

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+"");
    }
}

正如我所说,您从启动器中获取所有软件包,并将它们与能够执行操作的软件包进行匹配,无论是拍照还是浏览网页。你应该能够让这件事继续下去。

于 2012-05-09T09:03:27.183 回答
2

在 API 版本 30 以上,我需要在queriesAndroidManifest.xml 中添加一个部分,因为新的包可见性规则(除了PackageManager.MATCH_ALL上面提到的使用)。

<manifest ...>
    <application ... />
    <queries>
        <intent>
            <action android:name="android.intent.action.VIEW" />
            <data android:scheme="http" />
        </intent>
    </queries>
</manifest>
于 2021-01-22T20:09:08.063 回答
1

如果其他人需要答案:

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将包含所有浏览器的包信息。

于 2018-02-05T05:59:30.103 回答