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
相关产品推荐
相关产品推荐

