You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解析YouTube API返回的JSONObject并将videoId传递给loadVideo方法

实现优化建议
  • 补充空值校验:当前使用optJSONObject和optString已经比直接用get系列方法更安全,但仍需补充空判断逻辑:比如返回的items数组为空(当前无正在直播的流)、数组内的单个直播元素为空、id对象为空、videoId为空的场景都要做分支处理,避免空指针异常。
  • 去掉不必要的循环:添加eventType=live参数后,YouTube Data API同一时间最多只会返回同一个频道的1个正在直播的流,不需要遍历整个数组,直接取数组第一个元素即可,精简逻辑。
  • 修复Volley队列初始化问题:之前出现空对象引用报错是因为调用mQueue.add(request)前没有初始化请求队列,需要在onCreate/onCreateView阶段提前初始化:RequestQueue mQueue = Volley.newRequestQueue(requireContext());。
  • 补全错误分支逻辑:当前ErrorListener是空实现,建议添加错误提示,比如网络异常、API密钥无效、接口配额耗尽的场景,给用户明确的反馈。
  • 优化变量命名:你当前把id对应的JSONObject命名为jsonArray1语义不清晰,容易造成后续维护误解,建议改为idObject这类和业务含义匹配的命名。
传递videoId到loadVideo的实现

你只需要在解析拿到有效videoId之后,直接调用youTubePlayer的loadVideo方法即可,注意要保证youTubePlayer已经完成初始化,不要在播放器初始化成功前调用该方法,避免空指针。
优化后的完整代码示例:

// 初始化Volley请求队列,放在onCreate/onCreateView中执行
RequestQueue mQueue = Volley.newRequestQueue(requireContext());
// 构建请求URL
String url = "https://www.googleapis.com/youtube/v3/search?part=snippet&channelId=(MyChannelID)&eventType=live&type=video&key=(MyKey)";
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
        new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                try {
                    JSONArray itemsArray = response.getJSONArray("items");
                    // 无正在直播的流
                    if (itemsArray.length() == 0) {
                        ytapi.setText("当前暂无正在直播的内容");
                        return;
                    }
                    // 直接取第一个直播流
                    JSONObject liveItem = itemsArray.optJSONObject(0);
                    if (liveItem == null) return;
                    JSONObject idObject = liveItem.optJSONObject("id");
                    if (idObject == null) return;
                    String videoId = idObject.optString("videoId");
                    if (TextUtils.isEmpty(videoId)) {
                        ytapi.setText("获取直播ID失败");
                        return;
                    }
                    // 更新UI展示
                    ytapi.setText(videoId);
                    // 调用播放器加载直播,需保证youTubePlayer已完成初始化
                    if (youTubePlayer != null) {
                        youTubePlayer.loadVideo(videoId, 0);
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                    ytapi.setText("解析直播数据失败");
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                error.printStackTrace();
                ytapi.setText("请求直播数据失败,请检查网络或API配置");
            }
        });
// 将请求加入队列
mQueue.add(request);

额外注意:如果需要实现直播重建后自动切流,可以加定时任务每隔1-2分钟请求一次API,对比返回的videoId和当前播放的ID是否一致,发生变化时重新调用loadVideo加载新流即可。

内容的提问来源于stack exchange,提问作者BinDev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 21:06:03