首页 文章

无法读取此视频:已授予权限,VideoView和MediaController似乎已正确定义和使用

提问于
浏览
0

目标和背景

我希望在片段中显示YouTube视频,并在后者启动时启动 .

问题

我没有播放视频,而是在我的应用中显示错误:“此视频无法读取” . 开发人员的消息是在Android Studio的“运行pannel”中编写的 . 后者如下所示 .

实施

解释

  • 我在片段的布局中创建了一个 VideoView

  • 在片段的类中,我给 VideoView 充气并设置视频URI;我还定义了相关的 MediaController ;然后我开始 VideoView .

  • 我修改了清单以设置一些权限 .

来源

在片段的布局中

<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"

重现错误

用于测试的视频

以下视频仅为测试赢得了't be used in production. It':https://www.youtube.com/watch?v=CUA_ZvLyVFU(M. D. GUNDILL是最重要的举重理论家之一) .

说明

创建片段的类(活动)及其布局,粘贴上面的代码 . 不要忘记编辑清单(也粘贴上面的代码) . 要测试,请启动片段 .

类似的问题

我读了这些帖子及其实现我的视频播放器的答案 . 只有这个答案引起了我的注意:https://stackoverflow.com/a/24691623/6500085 . 但是,它并不想尝试另一种解决方案,因为我认为它应该正常工作 .

问题

如何启动视频?

显示的错误和异常

D / skia:近似值:numPoints = 3,length [0] = 0.000000,totalLength = 2.472497,segmentPoints [0] = [0.000000,0.100000]近似值:近似值[0] = 0.000000,近似值[1] = 0.000000,近似值[ 2] = 0.100000近似值:numPoints = 3,length [2] = 2.472497,totalLength = 2.472497,segmentPoints [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 = CU_ZvLyVFU D / MediaPlayer:setDataSource IOException | SecurityException发生:java.io.FileNotFoundException:没有内容提供者:https://www.youtube.com/watch?v = CUA_ZvLyVFU,位于android.content.ContentResolver的android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1402) . 位于android.media.MediaPlayer.setDataSource(MediaPlayer.java)的android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1176)中的openAssetFileDescriptor(ContentResolver.java:1253)位于android.media.MediaPlayer.attemptDataSource(MediaPlayer.java:1163) :1135)在Android.widget.VideoView.openVideo(VideoView.java:399)的android.media.MediaPlayer.setDataSource(MediaPlayer.java:1159)android.widget.VideoView.setVideoURI(VideoView.java:274) .widget.VideoView.setVideoURI(VideoView.java:257)at com.example.xxx.xxx.ForewordFragment $ 1.run(ForewordFragment.java:102)at android.os.Handler.handleCallback(Handler.java:789)at android andos的.os.Handler.dispatchMessage(Handler.java:98)在android.os.Looper.loop(Looper.java:164) oid.app.ActivityThread.main(ActivityThread.java:6944)at java.lang.reflect.Method.invoke(Native Method)at com.android.internal.os.Zygote $ MethodAndArgsCaller.run(Zygote.java:327)at at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)V / MediaHTTPService:MediaHTTPService(android.media.MediaHTTPService@92520d):Cookies:null V / MediaPlayerNative:setVideoSurfaceTexture V / MediaPlayer-JNI:setParameter:key 1400 V / MediaPlayerNative:MediaPlayer :: setParameter(1400)V / MediaPlayer-JNI:setAudioStreamType:3 V / MediaPlayerNative:MediaPlayer :: setAudioStreamType setVideoSurfaceTexture V / MediaPlayerNative:prepareAsync V / MediaHTTPService:makeHTTPConnection:CookieManager created:java.net.CookieManager @ b758fd3 V / MediaHTTPService:makeHTTPConnection(android.media.MediaHTTPService@92520d):cookieManager:java.net.CookieManager@b758fd3 Cookies:null D / MediaHTTPConnection:setReadTimeOut = 15000ms D / NetworkSecurityConfig:未指定Network Security Config,使用平台默认D / MediaH TTPConnection:setReadTimeout with 15000ms I / System.out:(HTTPLog)-Static:isSBSettingEnabled false I / zygote64:部分代码缓存集合,代码= 252KB,数据= 176KB I / System.out:(HTTPLog)-Static:isSBSettingEnabled false I / zygote64:代码缓存收集后,代码= 252KB,数据= 176KB将代码缓存容量增加到1024KB D / ViewRootImpl @ da487ab [ActivityHandlingFragments]:返回重新布局:old = [0,0] [1080,1920] new = [0 ,0] [1080,1920] result = 0x1 surface = {valid = true 508417486848} changed = false I / System.out:(HTTPLog)-Static:isSBSettingEnabled false(HTTPLog)-Static:isSBSettingEnabled false I / MediaHTTPConnection:响应代码= 200 V / MediaPlayerNative:消息收到msg = 300,ext1 = 0,ext2 = 0 V / MediaPlayerNative:从收到的回调消息收到SEC_MM_PLAYER_CONTEXT_AWARE回调应用程序msg = 100,ext1 = 1,ext2 = -2147483648 E / MediaPlayerNative:error(1,-2147483648)V / MediaPlayerNative:回调应用程序从回调E / MediaPlayer返回:错误(1,-2147483648)D / VideoView:错误:1,-2147483648 D / ScrollView:initGoToTop D / ScrollView:initGoToTop D / ViewRootImpl @ 2ef9a30 [ActivityHandlingFragments]:setView = DecorView @ 21f76a9 [] TM = true MM = false D / ViewRootImpl @ 2ef9a30 [ActivityHandlingFragments]:dispatchAttachedToWindow V / Surface:sf_framedrop debug:0x4f4c,game:false,logging: 0 D / ViewRootImpl @ 2ef9a30 [ActivityHandlingFragments]:返回重新布局:old = [0,0] [0,0] new = [27,792] [1053,1200] result = 0x7 surface = {valid = true 508409675776} changed = true D / mali_winsys:EGLint new_window_surface(egl_winsys_display *,void *,EGLSurface,EGL Config,egl_winsys_surface **,egl_color_buffer_format *,EGLBoolean)返回0x3000,[1218x600] -format:1 D / OpenGLRenderer:eglCreateWindowSurface = 0x7655707d20 D / ScrollView:onsize change changed D / ScrollView:onsize change changed D / ViewRootImpl @ 2ef9a30 [ActivityHandlingFragments] :MSG_WINDOW_FOCUS_CHANGED 1 D / ViewRootImpl @ 2ef9a30 [ActivityHandlingFragments]:MSG_RESIZED_REPORT:frame = Rect(27,792 - 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]:ViewPostIme指针1 D / OpenGLRenderer:eglDestroySurface = 0x7655707d20 D / ViewRootImpl @ 2ef9a30 [ActivityHandlingFragments]:dispatchDetachedFromWindow D / InputEventReceiver:channel'108e92 com.example.xxx.xxx/com.example.xxx.xxx.ActivityHandlingFragments(client)'〜处理输入事件接收器 . channel'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:BG show()Surface(name = Background) for - 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:reset V / MediaPlayerNative:收到的消息msg = 8,ext1 = 0,ext2 = 0 V / MediaPlayerNative:在断开连接的mediaplayer V / MediaPlayer上的notify(8,0,0)回调:resetDrmState: mDrmInfo = null mDrmProvisioningThread = null mPrepareDrmInProgress = false mActiveDrmScheme = false cleanDrmObj:mDrmObj = null mDrmSessionId = null V / MediaPlayer:resetDrmState:mDrmInfo = null mDrmProvisioningThread = null mPrepareDrmInPro gress = false mActiveDrmScheme = false cleanDrmObj:mDrmObj = null mDrmSessionId = null V / MediaPlayer-JNI:release V / MediaPlayerNative:setListener disconnect destructor disconnect D / ViewRootImpl @ da487ab [ActivityHandlingFragments]:MSG_WINDOW_FOCUS_CHANGED 0 D / SurfaceView:BG show()Surface( name =背景 - 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 surface = {valid = false 0} changed = true D / ViewRootImpl @ da487ab [ActivityHandlingFragments]:重新布局返回:old = [0,0] [1080,1920] new = [0,0] [1080 ,1920] result = 0x1 surface = {valid = false 0} changed = false应用程序终止 .

1 回答

  • 0

    这种技术阻碍我们播放YouTube上的视频而不下载后者并在本地存储(作为非临时文件) . https://www.youtube.com/watch?v=CUA_ZvLyVFU 不指向视频文件,而是指向网页 .

    为了使它工作,我将使用本地存储的自定义视频 .

    另一方面,如果我使用YouTube开发者API但我必须订阅该应用并且我不希望这样,我本来能够播放这个YouTube视频而不必将其作为非临时文件下载 .

相关问题