我想在片段中显示YouTube视频,该视频在片段开始播放时启动。
我没有在视频中播放错误,而是在我的应用中显示了一个错误:“此视频无法读取”。发给开发人员的消息写在Android Studio的“运行面板”中。后者显示如下。
我在片段的布局中创建了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"
以下视频不会在生产中使用。它仅用于测试:https://www.youtube.com/watch?v=CUA_ZvLyVFU(M。D. GUNDILL是举重最重要的理论家之一)。
创建片段的类(活动)及其布局,粘贴上面的代码。不要忘记编辑清单(也粘贴上面的代码)。要测试,请开始片段。
我阅读了这些信息及其答案,以实现我的视频播放器。只有这个答案引起了我的注意: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应用程序已终止。
答案 0 :(得分:0)
此技术会阻止我们从YouTube播放视频,而无需下载后者并将其本地存储(作为非临时文件)。 https://www.youtube.com/watch?v=CUA_ZvLyVFU
不是指向视频文件,而是指向网页。
要使其正常工作,我将使用本地存储的自定义视频。
换句话说,如果我使用YouTube开发者API但必须订阅该应用并且我不想要该视频,那么我将能够播放该YouTube视频而不必将其下载为非临时文件。