Android Intent имеет значение null для ACTION_VIEW URL-адреса YouTube, даже если установлены Chrome и YouTube

В моем приложении для 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 19.02.2024 21:56

@CommonsWare Маловероятно. Я не помню, чтобы мне приходилось делать что-то подобное. У меня сложилось впечатление, что единственный материал манифеста должен быть на стороне YouTube/Chrome, чтобы заявить, что они обрабатывают намерения ACTION_VIEW. Этот код существует уже давно и имеет только одно обновление, призванное решить проблему с поиском действия, поэтому, скорее всего, он устарел. Можете ли вы направить меня в нужное место в документации или дать правильные ключевые слова для поиска? Заранее спасибо.

Kenny Wyland 19.02.2024 22:17
3
2
110
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В Android 11 появилась «видимость пакетов» для обеспечения конфиденциальности и безопасности. Если вы используете такие вызовы PackageManager, вам нужно добавить в манифест что-то, чтобы объявить, что вы ищете.

В вашем случае вы можете использовать:

    <queries>
        <intent>
            <action android:name = "android.intent.action.VIEW" />
        </intent>
    </queries>

Другие вопросы по теме