YouTubePlayerSupportFragment 不播放视频

2024-04-23

我有一个包含两个片段的 Activity(就像 YouTube 应用程序一样。)

  1. YouTubePlayerSupportFragment - 播放视频的半宽度。
  2. ListFragment 包含视频标题列表的列表,如 youtube。

活动一启动,我就会获取列表中的第一项并播放视频,它就可以工作。

当从列表中选择任何视频时,我将启动相同的活动(新实例),它可以很好地播放视频。但是当我单击后退按钮并返回到上一个屏幕时。上一个视频未播放,它无限显示进度条.

在新实例中,我将在 onDestroy 上释放 YouTube 播放器。

和旧实例我正在尝试这仍然没有用。

@Override protected void onStart() {
    super.onStart();
    if (mYouTubePlayer != null) {
      Timber.i("onStart " + mYoutubeUrlId + " time " + mYouTubePlayer.getCurrentTimeMillis());
      mYouTubePlayer.loadVideo(mYoutubeUrlId, mYouTubePlayer.getCurrentTimeMillis());
    } else {
      Timber.i("onStart else " + mYoutubeUrlId);
    }
  }

是否是由于在 Activity 的多个实例中使用 Youtube 片段?有什么建议可以解决问题吗?

public class VideoDetailActivity extends BaseActivity
    implements YouTubePlayer.OnInitializedListener, YouTubePlayer.OnFullscreenListener,
    VideoDetailMVPView, TagListCallBack,
    SectionVideoListFragment.OnListFragmentInteractionListener {
  private static final int RECOVERY_DIALOG_REQUEST = 1;

  @Inject VideoDetailPresenter mPresenter;
  YouTubePlayer mYouTubePlayer;
  boolean isInFullscreen;
  String mYoutubeUrlId;
  @BindView(R.id.text_video_detail_title) TextView mVideoTitleView;
  @BindView(R.id.list_video_detail_tags) RecyclerView mVideoTagListView;
  @BindView(R.id.container_video_details) LinearLayout mVideoDetailContainer;
  TagDataAdapter mTagListAdapter;

  @Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    activityComponent().inject(this);
    setContentView(R.layout.activity_video_detail);
    ButterKnife.bind(this);
    mPresenter.attachView(this);
    initialize();
  }

  void initialize() {
    setupToolbar();
    YouTubePlayerSupportFragment youtubeFragment =
        (YouTubePlayerSupportFragment) getSupportFragmentManager().findFragmentById(
            R.id.video_container);
    youtubeFragment.setRetainInstance(true);

    youtubeFragment.initialize(AppConstants.YOUTUBE_API_KEY, this);

    SectionVideoListFragment mVideoListContainer =
        (SectionVideoListFragment) getSupportFragmentManager().findFragmentById(
            R.id.video_list_container);

    if (mVideoListContainer != null) {
      mVideoListContainer.setParametersForSection(1,
          AppConstants.DEFAULT_SECTION_ID);//FIXME: Need to changed.

      mTagListAdapter = new TagDataAdapter(this, null, this);
      mVideoTagListView.setHasFixedSize(true);
      mVideoTagListView.setLayoutManager(
          new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
      mVideoTagListView.setAdapter(mTagListAdapter);
    }

    getVideoById(getIntent().getStringExtra(AppConstants.EXTRA_VIDEO_ID));
  }

  void getVideoById(String videoId) {
    if (mPresenter != null && isNetworkConnected()) {
      mPresenter.getVideoByTitleId(videoId);
    }
  }

  @Override public boolean providesActivityToolbar() {
    return true;
  }

  @Override protected void onStop() {
    super.onStop();
    if (mYouTubePlayer != null && mYouTubePlayer.isPlaying()) {
      Timber.i(" Youtube -- onStop Activity and video paused " + mYoutubeUrlId);
      mYouTubePlayer.pause();
    } else {
      Timber.i(" Youtube -- onStop Activity and video not paused " + mYoutubeUrlId);
    }
  }

  private void setupToolbar() {
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    if (getSupportActionBar() != null) {
      //getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_menu);
      getSupportActionBar().setDisplayHomeAsUpEnabled(true);
      getSupportActionBar().setTitle(R.string.title_activity_video_detail);
    }
  }

  @Override public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == android.R.id.home) finish();
    return super.onOptionsItemSelected(item);
  }

  @Override public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    Timber.i("onConfigurationChanged : " + newConfig.orientation);
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE && mYouTubePlayer != null) {
      mYouTubePlayer.setFullscreen(true);
    }
  }

  public static void launchScreen(Activity context, String videoId) {
    Intent intent = new Intent(context, VideoDetailActivity.class);
    intent.putExtra(AppConstants.EXTRA_VIDEO_ID, videoId);
    context.startActivity(intent);
  }

  @Override
  public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer,
      boolean wasRestored) {
    Timber.i("onInitializationSuccess" + mYoutubeUrlId);
    mYouTubePlayer = youTubePlayer;
    mYouTubePlayer.setPlayerStyle(YouTubePlayer.PlayerStyle.DEFAULT);
    if (!wasRestored && mYoutubeUrlId != null) mYouTubePlayer.loadVideo(mYoutubeUrlId);//AgzAbxRvBfs
    mYouTubePlayer.setOnFullscreenListener(this);
    mYouTubePlayer.setPlayerStateChangeListener(new PlayerStateChangeListener());
    mYouTubePlayer.setPlaybackEventListener(new PlaybackEventListener());
  }

  @Override public void onInitializationFailure(YouTubePlayer.Provider provider,
      YouTubeInitializationResult result) {
    if (result.isUserRecoverableError()) {
      result.getErrorDialog(this, RECOVERY_DIALOG_REQUEST).show();
    } else {
      String errorMessage = String.format(getString(R.string.error_player), result.toString());
      Toast.makeText(this, errorMessage, Toast.LENGTH_LONG).show();
    }
  }

  @Override public void onFullscreen(boolean isInFullscreen) {
    this.isInFullscreen = isInFullscreen;
  }

  @Override protected void onStart() {
    super.onStart();
    if (mYouTubePlayer != null) {
      Timber.i("onStart " + mYoutubeUrlId + " time " + mYouTubePlayer.getCurrentTimeMillis());
      mYouTubePlayer.loadVideo(mYoutubeUrlId, mYouTubePlayer.getCurrentTimeMillis());
    } else {
      Timber.i("onStart else " + mYoutubeUrlId);
    }
  }

  @Override public void onGetVideoByIdSuccess(VideoDetails response) {
    if (mYouTubePlayer != null && !mYouTubePlayer.isPlaying()) {
      mYoutubeUrlId = response.getYoutubeId();
      mYouTubePlayer.loadVideo(mYoutubeUrlId);
    }

    mVideoDetailContainer.setVisibility(View.VISIBLE);
    mVideoTitleView.setText(response.getTitle());
    mTagListAdapter.updateData(response.getTagList());
  }

  @Override public void onError(Throwable exception) {
    onAPICallError(exception);
  }

  @Override public void onAPICallStarted(int messageId) {

  }

  @Override protected void onDestroy() {
    super.onDestroy();
    if (mPresenter != null) mPresenter.detachView();
    if (mYouTubePlayer != null) {
      Timber.i(" Youtube -- destroy Activity and player released " + mYoutubeUrlId);
      mYouTubePlayer.release();
    } else {
      Timber.i(" Youtube -- destroy Activity and player not released " + mYoutubeUrlId);
    }
  }

  @Override public void onTagSelected(TagDetails tagDetails) {
    SectionVideoListActivity.launchScreenForTag(this, 1, tagDetails.getTagIdAsString(),
        tagDetails.getTagName());
  }

  @Override public void onItemClick(VideoDetails item) {
    VideoDetailActivity.launchScreen(this, item.getIdAsString());
    finish();
  }

  class PlaybackEventListener implements YouTubePlayer.PlaybackEventListener {

    @Override public void onPlaying() {
      Timber.i(" Youtube -- onPlaying " + mYoutubeUrlId);
    }

    @Override public void onPaused() {
      Timber.i(" Youtube -- onPaused " + mYoutubeUrlId);
    }

    @Override public void onStopped() {
      Timber.i(" Youtube -- onStopped " + mYoutubeUrlId);
    }

    @Override public void onBuffering(boolean b) {
      Timber.i(" Youtube -- onBuffering " + b + mYoutubeUrlId);
    }

    @Override public void onSeekTo(int i) {
      Timber.i(" Youtube -- onSeekTo " + mYoutubeUrlId);
    }
  }

  class PlayerStateChangeListener implements YouTubePlayer.PlayerStateChangeListener {

    @Override public void onLoading() {
      Timber.i(" Youtube -- OnLoaded " + mYoutubeUrlId);
    }

    @Override public void onLoaded(String s) {
      Timber.i(" Youtube -- onLoaded " + mYoutubeUrlId);
    }

    @Override public void onAdStarted() {
      Timber.i(" Youtube -- onAdStarted" + mYoutubeUrlId);
    }

    @Override public void onVideoStarted() {
      Timber.i(" Youtube -- onVideoStarted " + mYoutubeUrlId);
    }

    @Override public void onVideoEnded() {
      Timber.i(" Youtube -- onVideoEnded " + mYoutubeUrlId);
    }

    @Override public void onError(YouTubePlayer.ErrorReason errorReason) {
      Timber.i(" Youtube -- onError " + errorReason.name() + mYoutubeUrlId);
    }
  }
}

修复我的应用程序中的内存泄漏后,该错误不再出现。

因此,可以肯定地说,在播放视频时,Youtube SDK 会检查是否有足够的内存。如果没有内存,通常会显示以下一般错误:

There was a problem while playing (Playback ID: ....) Tap to retry
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

YouTubePlayerSupportFragment 不播放视频 的相关文章

随机推荐

  • git 忽略 Mac OS X 上带有空格的目录

    我正在尝试添加一些模式到我的 gitignore文件以忽略 Xcode 生成的 mode1v3 和 pbxuser 文件 但是 我的应用程序名称中有一个空格 因此我想忽略的文件位于Foo Bar xcodeproj 目录 添加这些模式的变体
  • 如何在 C++11 中输出枚举类的值

    我怎样才能输出一个值enum class在 C 11 中 在C 03中是这样的 include
  • 在 Bitnami LAMP 堆栈中设置和访问 PHP-FPM 状态页面

    我想查看 Bitnami LAMP 堆栈系统上的 PHP FPM 状态页面 但是 当我尝试时 我得到一个空白页 或者一条错误消息 Request exceeded the limit of 10 internal redirects due
  • 为什么 Gradle 需要 settings.gradle 文件?

    我要将我的 Android 项目从 Ant 转换为 Gradle 我的 Eclipse 工作区非常简单 Workspace MyApp MyApp AndroidLibrary 当我在 MyApp 中添加 build gradle 文件时
  • 如何在客户端-服务器模型(OpenCV C++)中通过套接字传输 cv::VideoCapture 帧?

    我通过套接字翻译视频 我在另一端看到视频流 但无法接收视频 我的视频文件是空的 我认为问题可能是接收端转换视频格式错误 我应该如何在服务器端对视频进行编码以及如何在客户端对视频进行解码 我使用 Linux Ubuntu Mate OpenC
  • 使用 CSV Django 模块以通用换行模式打开文件

    我正在尝试访问model filefield在 Django 中解析CSV http en wikipedia org wiki Comma separated values在 Python 中使用文件csv模块 它可以在 Windows
  • 在非托管主机下的托管组件中获取一部分空闲处理

    我有一个用 C 编写的托管组件 它由旧版 Win32 应用程序作为 ActiveX 控件托管 在我的组件内部 我需要能够获得通常情况下的内容Application Idle http msdn microsoft com en us lib
  • 使用 doctest 并登录 python 程序

    usr bin python2 4 import logging import sys import doctest def foo x gt gt gt foo 0 0 print d x logger debug d x def tes
  • JavaScript 中的文本压缩

    有没有图书馆 等等 在 JavaScript 中实现轻量级文本压缩 我真正的目标是稍微缩短一些文本并使其一目了然 它不需要提供安全性 文本将为用户显示 理想情况下 可以调整压缩以仅输出查询字符 a zA Z0 9 所以它可以在 URL 中传
  • 仅针对使用通道而定制的 Phoenix 应用程序如何在多台机器上扩展?使用HAProxy?如何向所有节点广播消息?

    我将节点应用程序纯粹用于带有 Redis PubSub 的 socket io 通道 目前我将其分布在 3 台机器上 并由其中一台机器上的 nginx 负载平衡提供支持 我想用 Phoenix 应用程序替换这个节点应用程序 而且我对 erl
  • 尝试测试字符串是否为整数时脚本崩溃

    我正在为 twitch 机器人制作一个 python 脚本 它基本上充当老虎机 免责声明 我对Python完全陌生 所以请不要杀我 在脚本的开头 我使用此代码来检查是否键入了正确的命令 检查第一个参数是否为整数 并检查用户是否有足够的积分
  • 依赖注入与托管依赖关系与全局对象

    我正在 Javascript BackboneJS 一个 MVC 框架 RequireJS 框架中工作 但这个问题有点 OO 通用 首先让我解释一下 在 Backbone 中 您的视图是传统视图和控制器的混合 而您的 HTML 模板是传统的
  • Python 面向对象编程:组合

    我一直在学习如何在 python 编程中实现组合 但我很难理解为什么它比继承更受欢迎 例如 到目前为止 这是我的代码 class Particle Constructor public def init self name charge r
  • 如何从 Java 8 中的迭代器获取第 n 个值?

    我整理了一个HashMap using 按值对 Map 进行排序 Java https stackoverflow com questions 109383 sort a mapkey value by values java对此我有一个L
  • Yii2 - 使用联结表插入关系数据,多对多连接

    我在使用 Yii2 稳定版 时遇到问题 我有一个 Content PK id 表 一个 Tag PK id 表和一个名为 Content Tag PK content id tag id 的联结表 我想用它来标记 例如 WP 标记 所有控制
  • 从 Guzzle 捕获 cURL 错误

    我有以下代码发出 Guzzle 4 1 请求 client new GuzzleHttp Client defaults headers User Agent gt userAgentString retry 0 do try return
  • 另一个日期时间问题

    我目前有一个这种格式的日期 2010 03 03 10 39 18 这是一个TIMESTAMPMySQL 中的字段 我需要为名为 Solr 的搜索引擎提供以下格式的日期 1995 12 31T23 59 59Z 以下是他们网站上有关日期的一
  • 服务资产发展非常缓慢

    我有一个带有默认资产管道的标准 Rails 3 Web 应用程序 突然之间 资源需要很长时间才能加载 我的页面加载时间从约 1 2 秒到约 1 分钟 服务器响应时间 home 正常 但某些 css 和 js 文件等待时间很长 长达 45 秒
  • Python Socket - 同时发送/接收消息

    基本上我一直在使用套接字和线程开发一个简单的聊天室 在我的客户端中 我可以接收和发送消息 我的问题是循环中一个消息先于另一个消息 所以如果我发送消息 我只会在发送消息后收到数据 我希望它像任何其他聊天室一样工作 当我发送消息时我可以收到消息
  • YouTubePlayerSupportFragment 不播放视频

    我有一个包含两个片段的 Activity 就像 YouTube 应用程序一样 YouTubePlayerSupportFragment 播放视频的半宽度 ListFragment 包含视频标题列表的列表 如 youtube 活动一启动 我就