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

时间:2018-10-28 14:59:10

标签: android android-mediaplayer android-videoview android-video-player

目标与背景

我想在片段中显示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(M。D. GUNDILL是举重最重要的理论家之一)。

说明

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

类似的问题

  1. How to display Video from URL in my android app?

我阅读了这些信息及其答案,以实现我的视频播放器。只有这个答案引起了我的注意:https://stackoverflow.com/a/24691623/6500085。但是,它似乎不起作用。我不想尝试其他解决方案,因为我认为它通常可以正常工作。

问题

如何开始播放视频?

显示的错误和异常

  

D / skia:近似值:numPoints = 3,长度[0] = 0.000000,   totalLength = 2.472497,segmentPoints [0] = [0.000000,0.100000]       近似值:近似值[0] = 0.000000,近似值[1] = 0.000000,近似值[2] = 0.100000       大约:numPoints = 3,长度[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=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.openAssetFileDescriptor(ContentResolver.java:1253)           在android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1176)           在android.media.MediaPlayer.attemptDataSource(MediaPlayer.java:1163)           在android.media.MediaPlayer.setDataSource(MediaPlayer.java:1135)           在android.media.MediaPlayer.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(Handler.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):Cookies:null   V / MediaPlayerNative:setVideoSurfaceTexture V / MediaPlayer-JNI:   setParameter:键1400 V / MediaPlayerNative:   MediaPlayer :: setParameter(1400)V / MediaPlayer-JNI:setAudioStreamType:   3 V / MediaPlayerNative:MediaPlayer :: setAudioStreamType       setVideoSurfaceTexture V / MediaPlayerNative:prepareAsync V / MediaHTTPService:makeHTTPConnection:创建的CookieManager:   java.net.CookieManager@b758fd3 V / MediaHTTPService:   makeHTTPConnection(android.media.MediaHTTPService@92520d):   cookieManager:java.net.CookieManager@b758fd3 Cookies:null   D / MediaHTTPConnection:setReadTimeOut = 15000ms   D / NetworkSecurityConfig:未使用指定网络安全配置   平台默认D / MediaHTTPConnection:setReadTimeout与15000ms   I / System.out:(HTTPLog)-静态:isSBSettingEnabled false I / zygote64:   执行部分代码缓存收集,代码= 252KB,数据= 176KB I / System.out:   (HTTPLog)-静态:isSBSettingEnabled false I / zygote64:代码后   缓存收集,代码= 252KB,数据= 176KB       将代码缓存容量增加到1024KB D / ViewRootImpl @ da487ab [ActivityHandlingFragments]:中继返回:   旧= [0,0] [1080,1920]新= [0,0] [1080,1920]结果= 0x1   surface = {valid = true 508417486848}已更改= false I / System.out:   (HTTPLog)-静态:isSBSettingEnabled false       (HTTPLog)静态: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:错误(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 /曲面:sf_framedrop调试:0x4f4c,游戏   :错误,记录:0   D / ViewRootImpl @ 2ef9a30 [ActivityHandlingFragments]:中继返回:   旧= [0,0] [0,0]新= [27,792] [1053,1200]结果= 0x7曲面= {有效= true   508409675776}已更改= true D / mali_winsys:EGLint   new_window_surface(egl_winsys_display *,void *,EGLSurface,   EGLConfig,egl_winsys_surface **,egl_color_buffer_format *,   EGLBoolean)返回0x3000,[1218x600]格式:1 D / OpenGLRenderer:   eglCreateWindowSurface = 0x7655707d20 D / ScrollView:onsize更改   更改了D / ScrollView:onsize更改了   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:通道'108e92   com.example.xxx.xxx/com.example.xxx.xxx.ActivityHandlingFragments   (客户端)'〜处置输入事件接收器。       频道'108e92 com.example.xxx.xxx/com.example.xxx.x.ActivityHandlingFragments   (客户端)'〜NativeInputEventReceiver。   D / ViewRootImpl @ da487ab [ActivityHandlingFragments]:   MSG_WINDOW_FOCUS_CHANGED 1 E / ViewRootImpl:sendUserActionEvent()   回到。 V / InputMethodManager:开始输入:   tba=android.view.inputmethod.EditorInfo@d9c3763 nm:   com.example.x.x ic = null I / InputMethodManager:   startInputInner-mService.startInputOrWindowGainedFocus   D / SurfaceView:BG show()Surface(名称=背景-SurfaceView-   com.example.x.x / com.example.x.x.ActivityHandlingFragments @ 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:重置V / MediaPlayerNative:重置V / MediaPlayerNative:收到消息   msg = 8,ext1 = 0,ext2 = 0 V / MediaPlayerNative:notify(8,0,0)回调   断开的媒体播放器V / MediaPlayer:resetDrmState:mDrmInfo = null   mDrmProvisioningThread = null mPrepareDrmInProgress = false   mActiveDrmScheme =假       cleanDrmObj:mDrmObj = null mDrmSessionId = null V / MediaPlayer:resetDrmState:mDrmInfo = null mDrmProvisioningThread = null   mPrepareDrmInProgress = false mActiveDrmScheme = false       cleanDrmObj:mDrmObj = null mDrmSessionId = null V / MediaPlayer-JNI:发布V / MediaPlayerNative:setListener       断开       析构函数       断开D / ViewRootImpl @ da487ab [ActivityHandlingFragments]:MSG_WINDOW_FOCUS_CHANGED 0 D / SurfaceView:BG show()   Surface(名称=背景-SurfaceView-   com.example.x.x / com.example.x.x.ActivityHandlingFragments @ 5bd5b7f @ 0)   android.widget.VideoView {5bd5b7f VFE ...... .F ...... 0,1989-1080,2589   7f0a00fd app:id / videoView} D / OpenGLRenderer:eglDestroySurface = 0x7671813a00 D / ViewRootImpl @ da487ab [ActivityHandlingFragments]:   重新发出中继:旧= [0,0] [1080,1920]新= [0,0] [1080,1920]   结果= 0x5表面= {有效=假0}已更改=真   D / ViewRootImpl @ da487ab [ActivityHandlingFragments]:中继返回:   旧= [0,0] [1080,1920]新= [0,0] [1080,1920]结果= 0x1   surface = {valid = false 0}已更改= false应用程序已终止。

1 个答案:

答案 0 :(得分:0)

此技术会阻止我们从YouTube播放视频,而无需下载后者并将其本地存储(作为非临时文件)。 https://www.youtube.com/watch?v=CUA_ZvLyVFU不是指向视频文件,而是指向网页。

要使其正常工作,我将使用本地存储的自定义视频。

换句话说,如果我使用YouTube开发者API但必须订阅该应用并且我不想要该视频,那么我将能够播放该YouTube视频而不必将其下载为非临时文件。