Android YouTube API“初始化 YouTube 播放器时发生错误”

2024-02-08

我有一个包含以下内容的片段YouTubePlayerSupportFragment https://developers.google.com/youtube/android/player/reference/com/google/android/youtube/player/YouTubePlayerSupportFragment。该片段位于 ViewPager 内。

该播放器在我的 Galaxy S3 Android 手机 (4.3 / API 18) 和我的虚拟机 (4.3 / API 18) 上运行良好。 但在我尝试过的所有其他手机上,播放器都会显示An error occurred while initializing YouTube player消息并抛出初始化失败时 https://developers.google.com/youtube/android/player/reference/com/google/android/youtube/player/YouTubePlayer.OnInitializedListener#onInitializationFailure(com.google.android.youtube.player.YouTubePlayer.Provider,%20com.google.android.youtube.player.YouTubeInitializationResult)UNKNOWN_ERROR reason.

我检查了 LogCat,我的应用程序或 YouTube 绝对没有其他错误/警告。

它不适用于以下设备:

  • 安卓 4.2.1 - Youtube 10.18.55
  • 安卓 4.4.2 - Youtube 10.18.55
  • Android 5.1 - Youtube 以上要求

我完全不知道为什么它对某些人有效而对另一些人无效。

这是片段的代码:

    public class RoomFragmentVideo extends PlugFragment implements
    YouTubePlayer.OnInitializedListener, YouTubePlayer.PlayerStateChangeListener {
            private static String CLASS_DBG_NAME = "RoomFragmentVideo";

            private static final int RECOVERY_DIALOG_REQUEST = 1;

            private YouTubePlayerSupportFragment youTubePlayer ;
            private int playerInitialized;
            private YouTubePlayer player;

            static PlugFragment init(Bundle args) {
                     RoomFragmentVideo roomFrag = new RoomFragmentVideo();
                     // Supply val input as an argument.
                     roomFrag.setArguments(args);
                     Log.d(Constants.APP_DBG_LOG + CLASS_DBG_NAME + " - ","Created with args Room: "  + ((String)args.get(RoomFragmentChat.ARG_ROOM)));
                     return roomFrag;
            }

            @Override
            public void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
             thisActivity = (AppCompatActivity) this.getActivity();
            }

            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
             Bundle savedInstanceState) {
                     View rootview = inflater.inflate(R.layout.fragment_roomvideo, container,false);
                     youTubePlayer = YouTubePlayerSupportFragment.newInstance();
                     FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
                     transaction.add(R.id.youtube_fragment, youTubePlayer).commit();
                     youTubePlayer.initialize(YouTubeDeveloperKey.DEVELOPER_KEY, this);
                     return rootview;

            }

            protected YouTubePlayer.Provider getYouTubePlayerProvider() {
                return youTubePlayer;
            }

            @Override
            public void onActivityResult(int requestCode, int resultCode, Intent data) {
                if (requestCode == RECOVERY_DIALOG_REQUEST) {
                  getYouTubePlayerProvider().initialize(YouTubeDeveloperKey.DEVELOPER_KEY, this);
                }
            }         

            @Override
            public void onInitializationFailure(YouTubePlayer.Provider provider,
                          YouTubeInitializationResult errorReason) {
                    if (errorReason.isUserRecoverableError()) {
                          errorReason.getErrorDialog(this.getActivity(), 1).show();
                          Log.e(Constants.APP_DBG_LOG + CLASS_DBG_NAME + " - YouTube" ,"[Recoverable] Reason : " + errorReason.toString());
                    }
                    else {
                            //String errorMessage = String.format(getString(R.string.error_player), errorReason.toString());
                            String errorMessage = "Video couldnt load";
                            Toast.makeText(this.getActivity(), errorMessage, Toast.LENGTH_LONG).show();
                            Log.e(Constants.APP_DBG_LOG + CLASS_DBG_NAME + " - YouTube" ,"[Unrecoverable] Reason : " + errorReason.toString() + " Message: " + errorMessage);
                            playerInitialized = -1; 
                    }

            }

            @Override
            public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player,
                          boolean wasRestored) {
                            this.player = player;
                            player.setPlayerStyle(PlayerStyle.CHROMELESS);
                            player.loadVideo(this.videoID);
                            playerInitialized = 1;
            }

            @Override
            public void onPause(){
                    super.onPause();
                    Log.v(Constants.APP_DBG_LOG + CLASS_DBG_NAME + " - " , "onPause");
            }

            @Override
            public void onResume(){
                    super.onResume();
                    Log.v(Constants.APP_DBG_LOG + CLASS_DBG_NAME + " - " , "onResume");
            }

            @Override
            public void onStop(){
                    super.onStop();
                    player = null;
                    playerInitialized = -2;
                    Log.v(Constants.APP_DBG_LOG + CLASS_DBG_NAME + " - " , "onStop");
            }

            @Override
            public void setUserVisibleHint (boolean isVisibleToUser){
                    super.setUserVisibleHint(isVisibleToUser);
                    if(isVisibleToUser){
                            this.resume();
                    }
                    Log.v(Constants.APP_DBG_LOG + CLASS_DBG_NAME + " - " , "setUserVisibleHint, status: " + isVisibleToUser);
            }

            @Override
            public void onAdStarted() {
                    return;                
            }

            @Override
            public void onError(ErrorReason arg0) {
                    Log.e(Constants.APP_DBG_LOG + CLASS_DBG_NAME + " - " +"YoutubePlayer", arg0.name());
                    Toast.makeText(thisActivity, "YoutubePlayer error: " + arg0.name(), Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onLoaded(String arg0) {
                    return;
            }

            @Override
            public void onLoading() {
                    return;
            }

            @Override
            public void onVideoEnded() {
                    return;
            }

            @Override
            public void onVideoStarted() {
                    return;

            }
    }

这是 XML:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >

       <FrameLayout
            android:id="@+id/youtube_fragment"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            android:visibility="visible" />

    </LinearLayout>

我究竟做错了什么 ?

多谢 !


问题实际上是 proguard。 这是我添加到的内容proguard-project.txt file:

# keep youtube / google
-keep class com.google.api.services.** { *; }
-keep class com.google.android.youtube.player.** { *; }
# Needed by google-api-client to keep generic types and @Key annotations accessed via reflection
-keepclassmembers class * {
  @com.google.api.client.util.Key <fields>;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android YouTube API“初始化 YouTube 播放器时发生错误” 的相关文章

  • 如何在 Android 上以编程方式取消配对或删除配对的蓝牙设备?

    该项目是使用我的 Android 手机连接我的 arduino 设备 但我怎样才能取消配对 我看到配对列表似乎存储在蓝牙适配器可以随时检索的位置 附 第一 我知道长按已配对的设备会取消配对 但这里的问题是我怎样才能以编程方式实现这一点 2
  • 在 Android 中动态填充年份的微调器?

    我一直在绞尽脑汁试图让它发挥作用 我想动态地将 1900 年到当前年份的年份输入到旋转器中 我认为使用 XML 定义的数组不可能做到这一点 但是我可以使用数组适配器来做到这一点吗 这是我到目前为止所拥有的 ArrayList
  • Whatsapp 在 Android 中共享音频文件时正在剪切音频文件

    我在共享格式不是 mp3 的音频文件时遇到问题 文件被共享 但长度较短 例如 如果文件有 10 秒 则仅共享 5 秒 如果我使用 mp3 格式 它会完全共享 但其他格式会出现问题 注意 该文件在其他应用程序 如Messenger 中共享没有
  • 如何使用 Android 版 Facebook 同步的联系人图片

    我的手机上安装了 Android 版 Facebook 它会自动将联系人列表中人员的 FB 个人资料图片同步到我的手机 我想在我访问的应用程序中使用这些图片ContactsContract PhoneLookup 我真的需要 Faceboo
  • Android 构建 gradle 在特定设备上失败

    我面临一个奇怪的问题 当我编译我的应用程序以在 Android 7 0 的设备上运行它时 它可以工作 但是当我尝试为 Android 4 2 1 的设备进行编译时 它会失败并出现以下错误 错误 任务 app transformClasses
  • 任务“:app:checkReleaseDuplicateClasses”执行失败

    我的 React Native Android 构建中突然出现构建问题 令人惊讶的是 它是早上建好的 没有做任何改变 但突然就失败了 这就是我得到的错误 知道为什么会发生这种情况吗 在 stack 和 GitHub 中也看到了一些类似的问题
  • android - 过度绘制布局允许通过 LinearLayout 进行触摸

    在下面的 UI 中 我将下面的 drabable 覆盖了整个屏幕 LinearLayout 是透明的 并允许其下方的控件可单击或可触摸 基本上我可以滚动此 LinearLayout 下面的列表以及单击控件 我如何禁用它 See attach
  • 相当于Android中的javax.swing.Timer

    有没有类似的东西javax swing Timer在安卓上 我知道如何创建自己的线程 但是有类似摆动计时器的东西吗 您可能正在寻找课程android os CountDownTimer http developer android com
  • Android 上的硬币识别

    我目前正在开发一个 Android 应用程序 它能够拍摄硬币的现有图像 或者使用内置摄像头扫描单个硬币 非常像 Google Goggles 我正在使用 Android 版 OpenCV 我的问题如下 什么方法最适合使用 OpenCV 在
  • 使用 POST 将数据从 Android 发送到 AppEngine Datastore

    抱歉 如果这是一个简单的问题 但我只是不知道我应该做什么 而且我认为我有点超出了我的深度 我想将数据从 Android 应用程序发送到在 Google App Engine 上运行的应用程序 数据必须从那里写入数据存储区 我的数据主要采用对
  • 安卓;在 AdapterViewFlipper 上设置输入/输出动画:未知的动画师名称翻译

    我有一些非常简单的动画 可以与 ViewFlipper 完美配合 但如果我尝试在 AdapterViewFlipper 输入 输出上设置它们 我会收到运行时错误 未知的动画师名称翻译 查看每个方法的相应方法 看起来 ViewFlipper
  • NullPointerException org.chromium.android_webview.AwContents$AwViewMethodsImpl.onDragEvent

    大约 10 天前 我的应用程序开始记录此异常 在开发控制台上看到 java lang NullPointerException at org chromium android webview AwContents AwViewMethods
  • 使用startActivityForResult,如何获取子活动中的requestCode?

    我有四项活动 即 A B C 和 D 我的情况是A将通过startActivityForResult启动活动B startActivityForResult new Intent this B class ONE 在另一种情况下 我将使用不
  • NoClassDefFoundError:com.google.firebase.FirebaseOptions

    我继续得到NoClassDefFoundError在我正在使用的其他测试设备 4 4 2 上 但在我的测试设备 Android 5 1 上运行良好 我尝试了用谷歌搜索的解决方案 但似乎没有任何效果 我正在使用 Firebase 实时数据库
  • 如何在Android中隐藏应用程序标题? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想隐藏应用程序标题栏 您可以通过编程来完成 import android app Activity import android os
  • EditText 的高度不会扩展到其父级的高度

    我在滚动视图中放置了编辑文本 高度 match parent并期望它的高度等于滚动视图 但事实并非如此 它的高度就像wrap content这意味着如果 EditText 中没有文本 我必须将光标指向要弹出的软键盘的第一 行 我想要的是我可
  • Android apk 调试模式工作正常,但发布模式给出太多警告

    我正在尝试从 eclipse 获取签名的 APK 我有一个可调试的 apk 版本 运行良好 现在发布时 当我尝试使用 Eclipse ADT 进行编译和签名时 我收到很多警告 其中大部分是can t find superclass or i
  • 如何使用asynctask显示倒计时的进度条?

    在我的应用程序中 我希望用户按下按钮 然后等待 5 分钟 我知道这听起来很糟糕 但就这样吧 5 分钟等待期间的剩余时间应显示在进度条中 我使用带有文本视图的 CountDownTimer 来倒计时 但我的老板想要看起来更好的东西 这就是进度
  • 在 Android SDK 中通过单击按钮更改背景颜色不起作用

    我有一个简单的程序 可以在单击按钮后更改背景颜色 但它不起作用 public class ChangeBackgroundActivity extends Activity Called when the activity is first
  • Java中如何限制文件大小

    我正在我的应用程序中创建一个文件 并继续向该文件中写入一些内容 但是当我的文件达到一定大小 比如说 100 行 后 我想删除第一行并将新行写入底部 要求是我的文件应该受到限制 但它应该保留我写入文件的最新内容 请告诉我在Java中是否可行

随机推荐