我的 Android 应用程序中有一个“帮助”菜单,它将显示帮助网页或帮助视频。随着时间的推移,我们遇到了一些奇怪的问题,意图返回 null,因为他们没有浏览器或类似的东西(至少这是我之前基于 Firebase 异常报告的假设)。因此,我们使代码变得更加复杂,以检查以几种不同方式组合在一起的 YouTube 视频网址的任何应用程序。如果系统表示没有应用程序可以处理它,则尝试以不同的方式构建 Intent。
这终于发生在我身上,所以这很好!但是,我的手机上安装了 Chrome 和 YouTube 应用程序,但resolveActivity() 返回为 null。
在下面的代码中,
youtubeuri = "https://www.youtube.com/watch?v=JHb9wYcmQcg"
和videourlstring = "https://www.youtube.com/watch?v=JHb9wYcmQcg"
(在这种特殊情况下,网址最终是相同的)。
但即使我安装了 Chrome 和 YouTube,它也找不到启动 YouTube 网址的基本
ACTION_VIEW
意图的活动。
最近版本的 AndroidOS 是否发生了某些变化,如果没有特殊权限或其他什么东西,我的操作方式将不再起作用?我做错了什么?
private void startVideo(HelpTutorial tutorial) {
String videoid = tutorial.getVideoID();
Uri youtubeuri = Uri.parse("https://www.youtube.com/watch?v=" + videoid);
Intent intent = new Intent(Intent.ACTION_VIEW, youtubeuri);
List<ResolveInfo> list = this.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
if (list.size() == 0) {
String videourlstring = tutorial.getVideoURLString();
intent = new Intent(Intent.ACTION_VIEW, Uri.parse(videourlstring));
}
if (intent.resolveActivity(getPackageManager()) != null) {
this.startActivity(intent);
} else {
AlertDialogFragment alert = new AlertDialogFragment();
alert.setTitle(getString(R.string.no_browser_installed_title));
alert.setMessage(getString(R.string.no_browser_installed_message));
alert.show(getSupportFragmentManager(), "No Browser Error");
}
}
编辑:
如果我只是
startActivity()
,即使 resolveActivity()
返回 null,YouTube 应用程序实际上也会打开。因此,该应用程序已安装并可以运行...但由于某种原因,我的应用程序不允许看到这一点。
Android 11 引入了“包可见性”,以保护隐私/安全。如果您使用此类
PackageManager
调用,则需要 将内容添加到清单中以声明您要查找的内容。
根据您的情况,您可能可以使用:
<queries>
<intent>
<action android:name="android.intent.action.VIEW" />
</intent>
</queries>