栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Android中获取设备已安装的所有浏览器应用列表 并选择指定浏览器展示网页

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android中获取设备已安装的所有浏览器应用列表 并选择指定浏览器展示网页

Android中获取设备已安装的所有浏览器应用列表 并选择指定浏览器打开网址 需求:通过下拉选择设备中已安装的浏览器,然后输入网址,打来浏览器展示网页 一.获取浏览器
 private fun getBrowserList(): List {
        val packageManager: PackageManager = getPackageManager()
        val intent = Intent(Intent.ACTION_VIEW)
        intent.data = Uri.parse("http://")
        val activities = packageManager.queryIntentActivities(intent, PackageManager.MATCH_ALL)
        return activities
    }

运行结果:发现运行出来还有’淘宝’ '微博’这些APP

万能的百度 找到一个博主说淘宝客户端也添加了Intent.CATEGORY_BROWSABLE这个category过滤,通过查看com.android.internal.app.ResolverActivity的代码,于是修改方案如下:

 
    fun getBrowserList(context: Context): List {
        val packageManager = context.packageManager
        val intent = Intent(Intent.ACTION_VIEW)
        intent.addCategory(Intent.CATEGORY_BROWSABLE)
        intent.setData(Uri.parse("http://"))
        val activities =
            packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY)
        val r0 = activities[0]
        val activity_iter = activities.iterator()
        while (activity_iter.hasNext()) {
            val resolveInfo = activity_iter.next()
            if (r0.priority != resolveInfo.priority || r0.isDefault != resolveInfo.isDefault) {
                activities.remove(resolveInfo)
            }
        }
        return activities
    }

补充: 这里发现只返回了手机默认的浏览器,因为一开始手机只有一个浏览器我以为成功了,结果发现PackageManager.MATCH_DEFAULT_ONLY会因为手机设置了默认浏览器后,无法完整的获取浏览器列表
所以修改成PackageManager.MATCH_ALL 然后发现只是少了’淘宝’上图的’网易云音乐’ ‘微博’ 还是有返回,这个有待研究,有小伙伴知道也望告知

好了到这里浏览器列表就获取到了,接下来就是打开指定浏览器

    
    private fun toBrowser(packageName: String, className: String, uri: String) {
        val intent = Intent()
        intent.action = "android.intent.action.VIEW"
        val contentUrl: Uri = Uri.parse(uri)
        intent.data = contentUrl
        intent.setClassName(packageName, className)
        startActivity(intent)
        finish()
    }

其实只要修改 intent.setClassName(packageName, className)中相应的应用程序packagename 和要启动的activity即可启动其他浏览器来
packageName和className都可以在获取浏览器列表中得到

            //获取应用包名
            val packageName = resolveInfo.activityInfo.packageName
            //获取启动activity
            val className = resolveInfo.activityInfo.name
            //获取应用名称
            val name = resolveInfo.loadLabel(packageManager).toString()
            //获取应用图标
            val drawable = resolveInfo.loadIcon(getPackageManager())

这边再做个补充记录好了

获取应用列表
    
    private fun getPkgList(): List? {
        val packages: MutableList = ArrayList()
        try {
            val p = Runtime.getRuntime().exec("pm list packages")
            val isr = InputStreamReader(p.inputStream, "utf-8")
            val br = BufferedReader(isr)
            var line: String = br.readLine()
            while (line != null) {
                line = line.trim { it <= ' ' }
                if (line.length > 8) {
                    val prefix = line.substring(0, 8)
                    if (prefix.equals("package:", ignoreCase = true)) {
                        line = line.substring(8).trim { it <= ' ' }
                        if (!TextUtils.isEmpty(line)) {
                            packages.add(line)
                        }
                    }
                }
                line = br.readLine()
            }
            br.close()
            p.destroy()
        } catch (t: Throwable) {
            t.printStackTrace()
        }
        return packages
    }
     
    private fun getPkgListNew(): List? {
        val packages: MutableList = ArrayList()
        try {
            val packageInfos: List = packageManager.getInstalledPackages(
                PackageManager.GET_ACTIVITIES or PackageManager.GET_SERVICES
            )
            for (info in packageInfos) {
                val pkg = info.packageName
                packages.add(pkg)
                if (!isSystemApp(info)) {
                    //获取应用名称
                    val name = info.applicationInfo.loadLabel(packageManager).toString()
                    Log.d("不是系统应用", name)
                }
            }
        } catch (t: Throwable) {
            t.printStackTrace()
        }
        return packages
    }

记得添加权限啊

判断是否是系统应用
    
    private fun isSystemApp(pi: PackageInfo): Boolean {
        val isSysApp = pi.applicationInfo.flags and ApplicationInfo.FLAG_SYSTEM == 1
        val isSysUpd = pi.applicationInfo.flags and ApplicationInfo.FLAG_UPDATED_SYSTEM_APP == 1
        return isSysApp || isSysUpd
    }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/459755.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号