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

Kotlin MainActivity导入失效:YouTube视频缩略图开发遇阻

问题描述

我们正尝试通过代码实现YouTube视频缩略图加载并跳转至YouTube应用,已在app模块的build.gradle中同步以下依赖:

implementation 'com.google.api-client:google-api-client:1.31.3'
implementation 'com.google.apis:google-api-services-youtube:v3-rev20220225-1.31.3'
implementation 'com.github.bumptech.glide:glide:4.12.0'

但MainActivity中的导入语句显示红色、无法生效,怀疑使用了过时导入。尝试过查找导入信息、手动输入导入语句均无效,后续代码报错疑似因导入未生效导致。

附上MainActivity代码:

import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.widget.ImageView
import androidx.appcompat.app.AppCompatActivity
import com.bumptech.glide.Glide
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport
import com.google.api.client.json.JsonFactory
import com.google.api.client.json.jackson2.JacksonFactory
import com.google.api.services.youtube.YouTube
import com.google.api.services.youtube.model.SearchListResponse
import com.google.api.services.youtube.model.SearchResult
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext

class MainActivity : AppCompatActivity() {

    private lateinit var imageView: ImageView
    private lateinit var youtube: YouTube

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        imageView = findViewById(R.id.imageView)

        // Initialize YouTube API client
        youtube = YouTube.Builder(
            GoogleNetHttpTransport.newTrustedTransport(),
            JacksonFactory.getDefaultInstance(),
            null
        ).setApplicationName(getString(R.string.app_name)).build()

        // Load the thumbnail of the video with the given ID
        loadThumbnail("VIDEO_ID_HERE")
    }

    private fun loadThumbnail(videoId: String) {
        GlobalScope.launch {
            val thumbnailUrl = getThumbnailUrl(videoId)

            withContext(Dispatchers.Main) {
                // Load thumbnail into ImageView using Glide library
                Glide.with(this@MainActivity)
                    .load(thumbnailUrl)
                    .into(imageView)

                // Set click listener on ImageView to open the YouTube app
                imageView.setOnClickListener {
                    val intent = Intent(Intent.ACTION_VIEW, Uri.parse("vnd.youtube:$videoId"))
                    intent.putExtra("VIDEO_ID", videoId)
                    startActivity(intent)
                }
            }
        }
    }

    private suspend fun getThumbnailUrl(videoId: String): String {
        // Search for the video with the given ID
        val searchResponse = youtube.search().list("id").apply {
            q = videoId
            type = "video"
            fields = "items(id(videoId))"
            maxResults = 1
        }.execute()

        // Get the first search result, which should be the video we're looking for
        val searchResult: SearchResult = (searchResponse.items as List<SearchResult>)[0]

        // Get the URL of the default thumbnail for the video
        return "https://img.youtube.com/vi/${searchResult.id.videoId}/default.jpg"
    }
}

解决步骤

1. 补充缺失的依赖项

当前依赖缺少Android适配的Google API客户端库和JSON解析核心库,导致导入无法被识别。把以下依赖添加到app模块的build.gradle中:

// Android适配的Google API Client
implementation 'com.google.api-client:google-api-client-android:1.31.3'
// Jackson JSON解析核心库
implementation 'com.fasterxml.jackson.core:jackson-core:2.13.3'
implementation 'com.fasterxml.jackson.core:jackson-annotations:2.13.3'
implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.3'
// 协程依赖(如果项目未添加)
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4'

添加完成后点击Sync Project with Gradle Files同步项目。

2. 清理Android Studio缓存

导入变红大概率是缓存问题,执行以下操作:
点击菜单栏 File → Invalidate Caches... → Invalidate and Restart,重启IDE后重新同步依赖。

3. 修复YouTube API初始化问题

你的代码里初始化YouTube客户端时没有传入API密钥,就算导入正常,后续API请求也会直接失败。修改初始化代码:

// 替换成你在Google Cloud Console申请的YouTube Data API v3密钥
private val API_KEY = "YOUR_YOUTUBE_API_KEY"

// 初始化YouTube客户端
youtube = YouTube.Builder(
    GoogleNetHttpTransport.newTrustedTransport(),
    JacksonFactory.getDefaultInstance(),
    { request ->
        request.setInterceptor {
            it.setHeader("Authorization", "Bearer $API_KEY")
        }
    }
).setApplicationName(getString(R.string.app_name)).build()

注意:需要先在Google Cloud Console中创建项目,启用YouTube Data API v3并生成API密钥。

4. 简化缩略图获取逻辑(无需API调用)

其实完全不需要调用YouTube API就能拿到缩略图,直接用视频ID拼接URL即可,省去API密钥和复杂依赖的麻烦:
修改getThumbnailUrl函数:

private fun getThumbnailUrl(videoId: String): String {
    // 支持default/mqdefault/hqdefault/sddefault/maxresdefault等不同清晰度的缩略图
    return "https://img.youtube.com/vi/$videoId/hqdefault.jpg"
}

对应的loadThumbnail也可以简化,不需要协程:

private fun loadThumbnail(videoId: String) {
    val thumbnailUrl = "https://img.youtube.com/vi/$videoId/hqdefault.jpg"
    Glide.with(this)
        .load(thumbnailUrl)
        .into(imageView)

    imageView.setOnClickListener {
        val intent = Intent(Intent.ACTION_VIEW, Uri.parse("vnd.youtube:$videoId"))
        // 增加备选方案:如果设备没有安装YouTube应用,跳转到网页版
        if (intent.resolveActivity(packageManager) == null) {
            intent.data = Uri.parse("https://www.youtube.com/watch?v=$videoId")
        }
        startActivity(intent)
    }
}

5. 配置网络权限

确保AndroidManifest.xml中添加了网络权限:

<uses-permission android:name="android.permission.INTERNET" />

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 04:24:57