Это видео не может быть прочитано: разрешения предоставлены, VideoView и MediaController, похоже, правильно определены и используются - PullRequest
0 голосов
/ 28 октября 2018

Цель и контекст

Я хочу отобразить видео YouTube в моем фрагменте, запущенном при запуске последнего.

Проблема

Вместо воспроизведения видео,в моем приложении отображается ошибка: «Это видео не может быть прочитано».Сообщения для разработчиков пишутся в «Панели запуска» Android Studio.Последние показаны ниже.

Реализация

Пояснения

  1. Я создал VideoView в макете фрагмента

  2. В классе фрагмента я надуваю VideoView и задаю URI видео;Я также определяю связанный MediaController;затем я запускаю VideoView.

  3. Я изменил манифест для установки некоторых разрешений.

Источники

Во фрагментемакет

<VideoView
    android:id="@+id/videoView"
    android:layout_width="wrap_content"
    android:layout_height="200dp"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintTop_toBottomOf="@id/textView3"
    />

в классе фрагмента

    final VideoView videoView = inflated.findViewById(R.id.videoView);
    videoView.post(new Runnable() {
        @Override
        public void run() {
            MediaController mc = new MediaController(getContext());
            mc.setAnchorView(videoView);
            mc.setMediaPlayer(videoView);
            videoView.setMediaController(mc);
            videoView.setVideoURI(Uri.parse("https://www.youtube.com/watch?v=CUA_ZvLyVFU"));
            videoView.start();
        }
    });

в манифесте

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.xxx.xxx">
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"

Воспроизведение ошибки

Видео, использованное для проверки

Следующее видео не будет использоваться в производстве.Это просто для тестирования: https://www.youtube.com/watch?v=CUA_ZvLyVFU (MD GUNDILL - один из самых важных теоретиков пауэрлифтинга).

Инструкции

Создайте класс (вид деятельности) своего фрагмента и его макет, вставьтеприведенный выше код.Не забудьте отредактировать манифест (также вставьте приведенный выше код).Чтобы проверить, запустите свой фрагмент.

Подобные вопросы

  1. Как отобразить видео с URL в моем приложении для Android?

Я прочитал этот пост и его ответы, чтобы реализовать мой видеоплеер.Только этот ответ привлек мое внимание: https://stackoverflow.com/a/24691623/6500085.Тем не менее, это не похоже на работу.Я не хочу пробовать другое решение, так как считаю, что оно должно нормально работать.

Вопрос

Как запустить видео?

Отображаются ошибки и исключения

D / skia: приблизительный: numPoints = 3, длины [0] = 0,000000, totalLength = 2,472497, сегмент Point [0] = [0,000000,0,100000] приблизительный: приближение [0] = 0,000000, приближение [1] = 0,000000, приближение [2] = 0,100000, приближение: numPoints = 3, длины [2] = 2,472497, totalLength = 2,472497, сегмент Point [2] = [2,000000,0,100000] приблизительное: приближение [6] = 1,000000, приближение [7] = 2.000000, приближение [8] = 0.100000 I / MediaPlayer: необходимо включить контекстную информацию V / MediaPlayer-JNI: native_setup V / MediaPlayerNative: конструктор V / MediaPlayerNative: setListener V / MediaPlayer-JNI: get_session_id () W / MediaPlayer:Не удалось открыть https://www.youtube.com/watch?v=CUA_ZvLyVFU: java.io.FileNotFoundException: Нет поставщика контента: https://www.youtube.com/watch?v=CUA_ZvLyVFU D / MediaPlayer: setDataSource IOException |SecurityException произошло: java.io.FileNotFoundException: нет поставщика содержимого: https://www.youtube.com/watch?v=CUA_ZvLyVFU в android.content.ContentResolver.openTypedAssetFileDescriptor (ContentResolver.java:1402) в android.content.ContentResolver.openAssetFavaDolcript ()android.content.ContentResolver.openAssetFileDescriptor (ContentResolver.java:1176) в android.media.MediaPlayer.attemptDataSource (MediaPlayer.java:1163) в android.media.MediaPlayer.setDataSource (MediaPlayer.java.11:35)..setDataSource (MediaPlayer.java:1159) в android.widget.VideoView.openVideo (VideoView.java:399) в android.widget.VideoView.setVideoURI (VideoView.java:274) в android.widget.VideoView.setVideoURI (VideoView.Java: 257) на com.example.xxx.xxx.ForewordFragment $ 1.run (ForewordFragment.java:102) на android.os.Handler.handleCallback (Handler.java:789) на android.os.Handler.dispatchMessage (Обработчик.Java: 98) на android.os.Looper.loop (Looper.java:164) на android.app.ActivityThread.main (ActivityThread.java:6944) на java.lang.reflect.Method.invoke (собственный метод) на com.android.internal.os.Zygote $ MethodAndArgsCaller.run (Zygote.java:327) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1374)V / MediaHTTPService: MediaHTTPService (android.media.MediaHTTPService@92520d): файлы cookie: пусто V / MediaPlayerNative: setVideoSurfaceTexture V / MediaPlayer-JNI: setParameter: ключ 1400 V / MediaPlayerNative: MediaPlayer00: JP MediaPlayer: set-MediaPlayer: set-JP: MediaPlayer: set-JP: MediaPlayersetAudioStreamType: 3 V / MediaPlayerNative: MediaPlayer :: setAudioStreamType setVideoSurfaceTexture V / MediaPlayerNative: prepareAsync V / MediaHTTPService: makeHTTPConnection: CookieManager создан: java.net.CookieManager@bTergManagerHDTMT3TMDHD_MedagerMD3DTM_HD_Med_Med&DF_Med_Med_Med_Med_Med файлы::: TF: файл_процесса_проигрывателя_процессаjava.net.CookieManager@b758fd3 Файлы cookie: пусто D / MediaHTTPConnection: setReadTimeOut = 15000ms D / NetworkSecurityConfig: не задана конфигурация безопасности сети, используется значение по умолчанию платформы D / MediaHTTPConnection: setReadTimeout с 15000ms I / System.out: HTTPLableStingSting-Stfalse I / zygote64: выполнить частичный сбор кэша кода, код = 252 КБ, данные = 176 КБ I / System.out: (HTTPLog) -Static: isSBSettingEnabled false I / zygote64: послеколлекция кэша кода, код = 252 КБ, данные = 176 КБ Увеличение емкости кэша кода до 1024 КБ D / ViewRootImpl @ da487ab [ActivityHandlingFragments]: возвращено реле: old = [0,0] [1080,1920] new = [0,0] [1080, 1920] result = 0x1 surface = {valid = true 508417486848} изменено = false I / System.out: (HTTPLog) -Static: isSBSettingEnabled false (HTTPLog) -Static: isSBSettingEnabled false I / MediaHTTPConnection: код ответа = 200 В / MediaPlayerNative: сообщение получено msg = 300, ext1 = 0, ext2 = 0 V / MediaPlayerNative: получено приложение обратного вызова SEC_MM_PLAYER_CONTEXT_AWARE из сообщения обратного вызова, получено msg = 100, ext1 = 1, ext2 = -2147483648 E / MediaPlayerNative: ошибка (1, -2147483648)V / MediaPlayerNative: приложение обратного вызова обратно из обратного вызова E / MediaPlayer: Ошибка (1, -2147483648) D / VideoView: Ошибка: 1, -2147483648 D / ScrollView: initGoToTop D / ScrollView: initGoToTop D / ViewRootImpl @ 2ef9a30 [ActivityHandling setra= DecorView @ 21f76a9 [] TM = true MM = false D / ViewRootImpl @ 2ef9a30 [ActivityHandlingFragments]: dispatchAttachedToWindow V / Поверхность: sf_framedrop отладка: 0x4f4c, игра: false, запись в журнал: 0 D / ViewRootImpl @ 2ef9a30 [ActivityHandlingFragments]: возвращаемое релея: old = [0,0] [0,0] new = [27,792] [1053,1200] результат = 0x7 поверхность = {действует = истинная 508409675776} изменилось = TRUE Д / mali_winsys: EGLint new_window_surface (egl_winsys_display *, * пустота, EGLSurface, EGLConfig, egl_winsys_surface **, egl_color_buffer_format *, EGLBoolean) возвращает 0x3000, [1218x600] -format:1 D / OpenGLRenderer: eglCreateWindowSurface = 0x7655707d20 D / ScrollView: изменение размера изменено D / ScrollView: изменение размера изменено D / ViewRootImpl @ 2ef9a30 [ActivityHandlingFragments]: MSG_WINDOW_FOCUS_CHANGED 1REG_REG_RED_REG_RD_F_R_R_F_L_F_R_F_R_F_L_R_F_R_R_K_K_L_F_R_F_R_F_R_F_R_K_K_K_K_K_K_K_K_L_F_D_L_WR792 - 1053, 1200) ci = Rect (0, 0 - 0, 0) vi = Rect (0, 0 - 0, 0) или = 1 D / ViewRootImpl @ da487ab [ActivityHandlingFragments]: MSG_WINDOW_FOCUS_CHANGED 0 D / ViewRootImpl @ 2ef9a30 [ActivityHandlingFragments]: указатель ViewPostIme 0 D / ViewRootImpl @ 2ef9a30 [ActivityHandlingFragments]: ViУказатель ewPostIme 1 D / OpenGLRenderer: eglDestroySurface = 0x7655707d20 D / ViewRootImpl @ 2ef9a30 [ActivityHandlingFragments]: dispatchDetachedFromWindow D / InputEventReceiver: канал '108e92 com.example.xxx.xxxxxxxxxxxxxxxx)приемник входных событий.канал '108e92 com.example.xxx.xxx/com.example.xxx.x.ActivityHandlingFragments (client)' ~ NativeInputEventReceiver.D / ViewRootImpl @ da487ab [ActivityHandlingFragments]: MSG_WINDOW_FOCUS_CHANGED 1 E / ViewRootImpl: sendUserActionEvent () возвращено.V / InputMethodManager: начальный ввод: tba=android.view.inputmethod.EditorInfo@d9c3763 nm: com.example.xx ic = null I / InputMethodManager: startInputInner - mService.startInputOrWindowGainedFocus D / SurfaceView: name = BG show)для - SurfaceView -com.example.xx / com.example.xxActivityHandlingFragments @ 5bd5b7f @ 0) android.widget.VideoView {5bd5b7f VFE ...... .F ...... 0,1989-1080,2589 7f0a00fd app: id /videoView} D / SurfaceView: surfaceDestroyed 1 android.widget.VideoView {5bd5b7f VFE ...... .F ...... 0,1989-1080,2589 7f0a00fd app: id / videoView} V / MediaPlayer-JNI:reset V / MediaPlayerNative: сброс V / MediaPlayerNative: полученное сообщение msg = 8, ext1 = 0, ext2 = 0 V / MediaPlayerNative: обратный вызов notify (8, 0, 0) для отключенного медиаплеера V / MediaPlayer: resetDrmState: mDrmInfo = null mDrmProvisioningThread = null mDrmProvisioningThread =нуль-mPrepareDrmInProgress = ложь mActiveDrmScheme = ложь cleanDrmObj: mDrmObj = NULL mDrmSessionId = NULL В / медиаплеера: resetDrmState: mDrmInfo = NULL mDrmProvisioningThread = NULL mPrepareDrmInProgress = ложь mActiveDrmScheme = ложь cleanDrmObj: mDrmObj = NULL mDrmSessionId = NULL В / MediaPlayer-JNI: выпуск В /MediaPlayerNative: деструктор отключения отключения setListener D / ViewRootImpl @ da487ab [ActivityHandlingFragments]: MSG_WINDOW_FOCUS_CHANGED 0 D / SurfaceView:BG show () Surface (имя = фон для - SurfaceView - com.example.xx / com.example.xxActivityHandlingFragments @ 5bd5b7f @ 0) android.widget.VideoView {5bd5b7f VFE ...... .F .....0,1989-1080,2589 7f0a00fd app: id / videoView} D / OpenGLRenderer: eglDestroySurface = 0x7671813a00 D / ViewRootImpl @ da487ab [ActivityHandlingFragments]: возвращено реле: old = [0,0] [1080,1920] new = [0, 0] [1080,1920] result = 0x5 поверхность = {valid = false 0} изменено = true D / ViewRootImpl @ da487ab [ActivityHandlingFragments]: возвращено реле: old = [0,0] [1080,1920] new = [0, 0] [1080,1920] result = 0x1 поверхность = {valid = false 0} изменено = false Приложение прекращено.

1 Ответ

0 голосов
/ 28 октября 2018

Этот метод не позволяет нам воспроизводить видео с YouTube, не загружая его и не сохраняя локально (как временный файл).https://www.youtube.com/watch?v=CUA_ZvLyVFU указывает не на видеофайл, а на веб-страницу.

Чтобы заставить его работать, я собираюсь использовать собственное видео, хранящееся локально.

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

...