Другое

Как исправить ошибку плеера YouTube 15 в Android приложениях

Узнайте, как исправить ошибку плеера YouTube 15 в Android приложениях с помощью библиотеки Soffritti. Полное руководство с примерами кода и советами по устранению неполадок для разработчиков.

Как исправить ошибку “Error 15: This video is not available” при использовании YouTubePlayerView в Android с библиотекой Soffritti Android YouTube Player?

Я столкнулся с проблемой при попытке воспроизведения видео YouTube внутри моего Android-приложения с использованием библиотеки Soffritti Android YouTube Player (com.pierfrancescosoffritti.androidyoutubeplayer:core:12.1.0). Плеер успешно инициализируется, но при попытке загрузить видео отображается ошибка “Error 15: This video is not available”.

Вот моя текущая реализация:

java
public class YouTubePlayerFragment extends Fragment {

    private YouTubePlayerView youTubePlayerView;
    private String videoId = "NqrhOQRvz0U"; // Пример ID видео

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
                             @Nullable Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.youtube_video_player_fragment, container, false);
        youTubePlayerView = view.findViewById(R.id.youtubePlayerView);

        getLifecycle().addObserver(youTubePlayerView);

        youTubePlayerView.addYouTubePlayerListener(new AbstractYouTubePlayerListener() {
            @Override
            public void onReady(@NonNull YouTubePlayer youTubePlayer) {
                youTubePlayer.loadVideo(videoId, 0f);
            }

            @Override
            public void onError(@NonNull YouTubePlayer youTubePlayer, @NonNull PlayerConstants.PlayerError error) {
                Toast.makeText(requireContext(), "Error: " + error, Toast.LENGTH_LONG).show();
            }
        });

        return view;
    }
}

Детали окружения:

  • Android Studio Ladybug | 2025.1
  • targetSdkVersion: 35
  • Тестировано на: Pixel 7 (Android 14), Samsung S23 (Android 15 Beta)
  • Версия WebView: 128.x
  • URL видео YouTube: https://www.youtube.com/embed/NqrhOQRvz0U

Что может вызывать эту ошибку и как можно её исправить?

Ошибка 15: Это видео недоступно

Ошибка 15: “Это видео недоступно” обычно возникает, когда библиотека Soffritti Android YouTube Player сталкивается с проблемами совместимости с недавними изменениями в API YouTube, ограничениями на определенные видео или ограничениями версии Android. Эта ошибка часто затрагивает видео, имеющие географические ограничения, возрастные ограничения или внедренные с параметрами, которые не поддерживаются текущей версией библиотеки.

Содержание

Понимание ошибки 15

Ошибка 15 - это ошибка API YouTube, которая указывает на то, что запрошенное видео не может быть воспроизведено в контексте встроенного плеера. При использовании библиотеки Soffritti Android YouTube Player эта ошибка обычно проявляется, когда:

  • Видео имеет ограничения, препятствующие встраиванию
  • YouTube недавно внес изменения в API, влияющие на совместимость
  • Версия библиотеки не поддерживает определенные параметры видео
  • Ограничения версии Android блокируют воспроизведение

Согласно недавним отчетам, YouTube внедрил изменения, которые напрямую влияют на встроенные плееры, вызывая повсеместное возникновение ошибки 15 как на платформах Android, так и iOS.

Распространенные причины ошибки

1. Недавние изменения в API YouTube

YouTube регулярно обновляет свой API и политики встраивания. Как отмечено в исследованиях: “Недавно YouTube внес изменения, которые влияют на плеер YouTube, который мы используем в нашем приложении”. Эти изменения могут нарушить существующие реализации без предупреждения.

2. Совместимость с версией Android

Ошибка возникает чаще на более новых версиях Android (Android 11+). Один из пользователей сообщил: “В Android 11 возникает ошибка с сообщением ‘Произошла ошибка. Пожалуйста, попробуйте еще раз позже. (ID воспроизведения: XYZZZZZZZZZZZ)’ для каждой ссылки на видео”.

3. Ограничения, специфичные для видео

Некоторые видео нельзя встроить из-за:

  • Географических ограничений
  • Возрастных ограничений
  • Проблем с авторскими правами
  • Приватных видео
  • Ограничений на прямые трансляции

4. Конфликты версий WebView

Ваша версия WebView (128.x) может иметь проблемы совместимости с внутренней реализацией веб-просмотра библиотеки.

5. Ограничения библиотеки

Библиотека Soffritti не поддерживает все параметры плеера YouTube. Как указано в документации: “Не все из них поддерживаются в этой библиотеке, потому что некоторые не имеют смысла в этом контексте”.

Пошаговые решения

Решение 1: Обновите библиотеку

Во-первых, убедитесь, что вы используете последнюю версию библиотеки. Недавние обновления могли решить проблему ошибки 15.

gradle
implementation 'com.pierfrancescosoffritti.androidyoutubeplayer:core:12.1.0'

Проверьте официальную документацию на наличие самой последней версии.

Решение 2: Добавьте правильную обработку ошибок

Улучшите обработку ошибок для предоставления лучшей отладочной информации:

java
@Override
public void onError(@NonNull YouTubePlayer youTubePlayer, @NonNull PlayerConstants.PlayerError error) {
    Log.e("YouTubePlayer", "Произошла ошибка: " + error);
    
    if (error == PlayerConstants.PlayerError.UNEXPECTED_SERVICE_DISCOVERY_ERROR) {
        // Обработка определенных типов ошибок
        Toast.makeText(requireContext(), 
            "Ошибка службы YouTube. Пожалуйста, попробуйте еще раз позже.", 
            Toast.LENGTH_LONG).show();
    } else {
        Toast.makeText(requireContext(), 
            "Ошибка: " + error + "\nЭто видео может быть недоступно для встраивания.", 
            Toast.LENGTH_LONG).show();
    }
}

Решение 3: Попробуйте разные ID видео

Протестируйте с разными видео, чтобы определить, является ли проблема специфичной для определенных видео. Попробуйте с:

  • Публичными, неограниченными видео
  • Видео без возрастных ограничений
  • Видео от разных создателей
java
// Тестирование с известным работающим видео
private String testVideoId = "M7lc1UVf-VE"; // Примерное видео Google

Решение 4: Правильно обрабатывайте жизненный цикл фрагмента

Обеспечьте правильное управление жизненным циклом для YouTubePlayerView:

java
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    
    youTubePlayerView = view.findViewById(R.id.youtubePlayerView);
    getLifecycle().addObserver(youTubePlayerView);

    youTubePlayerView.addYouTubePlayerListener(new AbstractYouTubePlayerListener() {
        @Override
        public void onReady(@NonNull YouTubePlayer youTubePlayer) {
            youTubePlayer.loadVideo(videoId, 0f);
        }
        
        @Override
        public void onStateChange(@NonNull YouTubePlayer youTubePlayer, 
                                 @NonNull PlayerConstants.PlayerState state) {
            if (state == PlayerConstants.PlayerState.ENDED) {
                // Обработка окончания видео
            }
        }
    });
}

@Override
public void onDestroyView() {
    super.onDestroyView();
    if (youTubePlayerView != null) {
        getLifecycle().removeObserver(youTubePlayerView);
    }
}

Решение 5: Добавьте конфигурацию WebView

Настройте параметры WebView для обеспечения совместимости:

java
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    
    youTubePlayerView = view.findViewById(R.id.youtubePlayerView);
    
    // Настройка параметров WebView
    youTubePlayerView.getPlayerUiController().showYouTubeButton(false);
    youTubePlayerView.getPlayerUiController().showFullscreenButton(false);
    
    getLifecycle().addObserver(youTubePlayerView);
    
    youTubePlayerView.addYouTubePlayerListener(new AbstractYouTubePlayerListener() {
        @Override
        public void onReady(@NonNull YouTubePlayer youTubePlayer) {
            youTubePlayer.loadVideo(videoId, 0f);
        }
    });
}

Проблемы совместимости версий

Совместимость с Android 14 и 15

Для более новых версий Android (14 и 15) может потребоваться добавить дополнительные разрешения и конфигурации:

xml
<!-- В AndroidManifest.xml -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<!-- Для Android 14+ -->
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

Совместимость с WebView

Убедитесь, что ваш WebView обновлен и совместим:

java
// Проверка совместимости WebView
private boolean isWebViewSupported() {
    try {
        Class.forName("android.webkit.WebView");
        return true;
    } catch (ClassNotFoundException e) {
        return false;
    }
}

Альтернативные подходы

1. Используйте официальный API Android Player YouTube

Рассмотрите возможность использования официального API Android Player YouTube вместо текущего:

java
// Добавление зависимости
implementation 'com.google.android.youtube:youtube-android-player-api:1.2.2'

// Реализация
public class MainActivity extends YouTubeBaseActivity implements YouTubePlayer.OnInitializedListener {
    private static final String API_KEY = "ВАШ_API_КЛЮЧ";
    private static final String VIDEO_ID = "NqrhOQRvz0U";
    private YouTubePlayerView youTubePlayerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        youTubePlayerView = (YouTubePlayerView) findViewById(R.id.youtube_player);
        youTubePlayerView.initialize(API_KEY, this);
    }

    @Override
    public void onInitializationSuccess(YouTubePlayer.Provider provider, 
                                      YouTubePlayer player, boolean wasRestored) {
        if (!wasRestored) {
            player.cueVideo(VIDEO_ID);
        }
    }

    @Override
    public void onInitializationFailure(YouTubePlayer.Provider provider, 
                                      YouTubeInitializationResult errorReason) {
        Toast.makeText(this, "Ошибка инициализации плеера YouTube", Toast.LENGTH_LONG).show();
    }
}

2. Используйте Intent для открытия приложения YouTube

Если встроенный плеер не работает, откройте видео в приложении YouTube:

java
private void openInYouTubeApp(String videoId) {
    Intent appIntent = new Intent(Intent.ACTION_VIEW, 
        Uri.parse("vnd.youtube:" + videoId));
    Intent webIntent = new Intent(Intent.ACTION_VIEW, 
        Uri.parse("http://www.youtube.com/watch?v=" + videoId));
    
    try {
        startActivity(appIntent);
    } catch (ActivityNotFoundException ex) {
        startActivity(webIntent);
    }
}

3. Используйте WebView напрямую

Как запасной вариант, используйте WebView для загрузки URL встраивания YouTube:

java
private void loadVideoInWebView(String videoId) {
    WebView webView = findViewById(R.id.webView);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setDomStorageEnabled(true);
    webView.loadUrl("https://www.youtube.com/embed/" + videoId);
}

Лучшие практики предотвращения

1. Тестируйте несколько видео

Всегда тестируйте с несколькими видео перед развертыванием:

  • Публичные, неограниченные видео
  • Видео из разных регионов
  • Видео с разными типами контента

2. Мониторьте изменения в API YouTube

Будьте в курсе изменений в API YouTube:

3. Реализуйте плавную деградацию

Подготовьтесь к случаям, когда встроенный плеер не работает:

java
private void playVideoWithFallback(String videoId) {
    // Сначала попробуйте встроенный плеер
    youTubePlayerView.addYouTubePlayerListener(new AbstractYouTubePlayerListener() {
        @Override
        public void onReady(@NonNull YouTubePlayer youTubePlayer) {
            youTubePlayer.loadVideo(videoId, 0f);
        }

        @Override
        public void onError(@NonNull YouTubePlayer youTubePlayer, 
                          @NonNull PlayerConstants.PlayerError error) {
            if (error == PlayerConstants.PlayerError.UNEXPECTED_SERVICE_DISCOVERY_ERROR) {
                // Запасной вариант: приложение YouTube
                openInYouTubeApp(videoId);
            }
        }
    });
}

4. Используйте проверку видео

Перед попыткой воспроизведения проверяйте видео:

java
private boolean isVideoValid(String videoId) {
    // Проверка формата ID видео (11 символов, буквенно-цифровые)
    return videoId != null && videoId.matches("[a-zA-Z0-9_-]{11}");
}

5. Обрабатывайте сетевые проблемы

Реализуйте надежную обработку сети:

java
private void checkNetworkAndPlay() {
    ConnectivityManager connectivityManager = 
        (ConnectivityManager) requireContext().getSystemService(Context.CONNECTIVITY_SERVICE);
    
    if (connectivityManager != null) {
        Network activeNetwork = connectivityManager.getActiveNetwork();
        if (activeNetwork != null) {
            NetworkCapabilities capabilities = 
                connectivityManager.getNetworkCapabilities(activeNetwork);
            if (capabilities != null && 
                capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) ||
                capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
                // Сеть доступна, попробуйте воспроизвести
                youTubePlayerView.addYouTubePlayerListener(yourListener);
            } else {
                Toast.makeText(requireContext(), 
                    "Нет подключения к интернету", 
                    Toast.LENGTH_LONG).show();
            }
        }
    }
}

Заключение

Ошибка 15 в библиотеке Soffritti Android YouTube Player обычно вызвана недавними изменениями в API YouTube, ограничениями видео или проблемами совместимости с версией Android. Для решения этой проблемы:

  1. Обновите библиотеку до последней версии и проверьте наличие критических изменений
  2. Реализуйте комплексную обработку ошибок для определения конкретной причины
  3. Тестируйте с разными видео, чтобы определить, является ли проблема специфичной для видео
  4. Рассмотрите альтернативные подходы, такие как официальное API YouTube или запасной вариант с WebView
  5. Подготовьтесь к плавной деградации, когда встроенный плеер не работает

Ключевое понимание заключается в том, что YouTube регулярно обновляет свои политики встраивания и API, что может вызывать проблемы совместимости с сторонними библиотеками. Всегда имейте запасные механизмы и будьте в курсе изменений API YouTube.

Для получения самых актуальных решений следите за официальной документацией библиотеки Soffritti и соответствующими обсуждениями в сообществе, поскольку YouTube продолжает развивать свои платформенные политики.

Источники

  1. Stack Overflow - YouTube Player Error 15: This video is not available
  2. SmartChord - YouTube Player: ‘Video is unavailable’ with error code 15
  3. GitHub - PierfrancescoSoffritti/android-youtube-player
  4. FlutterFlow - YouTube Player Error Code 15 on iOS (works fine on Android)
  5. KnightCode - Fixing YouTube Player Error 15: A Comprehensive Guide
  6. Stack Overflow - Unable to play some Youtube videos using YouTube Android Player
Авторы
Проверено модерацией
Модерация