В моем приложении для Android есть меню «Справка», в котором отображается либо справочная веб-страница, либо справочное видео. Со временем у нас возникли некоторые странные проблемы с возвращением значения Intent к нулю, потому что у них нет браузера или чего-то в этом роде (по крайней мере, это было моим предположением, основанным на отчетах об исключениях Firebase). Поэтому мы немного усложнили код, чтобы проверить наличие приложений по URL-адресу видео YouTube, скомпонованным несколькими разными способами. Попытка построить намерение по-другому, если система говорит, что ни одно приложение не может с этим справиться.
Наконец-то это случилось со мной, и это хорошо! Однако на моем телефоне установлены Chrome и приложение YouTube, но функцияsolveActivity() возвращается как нулевое значение.
В приведенном ниже коде youtubeuri = "https://thewikihow.com/video_JHb9wYcmQcg"
и videourlstring = "https://thewikihow.com/video_JHb9wYcmQcg"
(в данном конкретном случае URL-адреса будут одинаковыми).
Но даже несмотря на то, что у меня установлены и Chrome, и YouTube, он не может найти действие для запуска намерения для базового ACTION_VIEW
URL-адреса YouTube.
Что-то изменилось в последней версии 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()
вернул ноль, приложение YouTube фактически откроется. Итак, приложение установлено и работает... но по какой-то причине моему приложению не разрешено это видеть.
@CommonsWare Маловероятно. Я не помню, чтобы мне приходилось делать что-то подобное. У меня сложилось впечатление, что единственный материал манифеста должен быть на стороне YouTube/Chrome, чтобы заявить, что они обрабатывают намерения ACTION_VIEW. Этот код существует уже давно и имеет только одно обновление, призванное решить проблему с поиском действия, поэтому, скорее всего, он устарел. Можете ли вы направить меня в нужное место в документации или дать правильные ключевые слова для поиска? Заранее спасибо.
В Android 11 появилась «видимость пакетов» для обеспечения конфиденциальности и безопасности. Если вы используете такие вызовы PackageManager
, вам нужно добавить в манифест что-то, чтобы объявить, что вы ищете.
В вашем случае вы можете использовать:
<queries>
<intent>
<action android:name = "android.intent.action.VIEW" />
</intent>
</queries>
Есть ли у вас соответствующий манифест, чтобы объявить о потребностях видимости вашего пакета?