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
}



