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

生成签名APK/Bundle后Android应用无法调用API获取数据求助

问题解决思路及方案

核心问题定位

你遇到的问题根源在于Release版本的OkHttpClient没有添加自动注入API密钥的拦截器:

  • Debug模式下,你给OkHttpClient添加了requestInterceptor,会自动在请求URL里追加api_key参数,所以能正常请求API;
  • 但Release模式下的OkHttpClient是完全新建的,没有这个拦截器,导致所有请求都缺少API密钥,被TMDB API拒绝。

另外,硬编码API密钥在代码里存在安全风险,也需要一并解决。


步骤1:修复Release版本的网络请求配置

修改ApiModule中的provideOkHttpClient方法,把requestInterceptor从Debug分支中抽离出来,确保Debug和Release版本都能自动注入API密钥:

@Singleton
@Provides
fun provideOkHttpClient(): OkHttpClient {
    // 所有模式都需要的API密钥注入拦截器
    val requestInterceptor = Interceptor { chain ->
        val url = chain.request()
            .url
            .newBuilder()
            .addQueryParameter("api_key", API_KEY)
            .build()

        val request = chain.request()
            .newBuilder()
            .url(url)
            .build()
        return@Interceptor chain.proceed(request)
    }

    val clientBuilder = OkHttpClient.Builder()
        .addInterceptor(requestInterceptor)

    // 仅Debug模式添加日志拦截器(方便调试)
    if (BuildConfig.DEBUG) {
        val loggingInterceptor = HttpLoggingInterceptor()
        loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY)
        clientBuilder.addInterceptor(loggingInterceptor)
    }

    return clientBuilder.build()
}

步骤2:安全隐藏API密钥

为了避免把API密钥硬编码在代码里(防止反编译泄露),可以通过local.properties和BuildConfig来管理:

  1. 修改local.properties文件
    在项目根目录的local.properties中添加你的API密钥(该文件默认不会被提交到版本控制):
API_KEY=你的实际TMDB密钥
  1. 修改build.gradle(app)配置
    在android.defaultConfig块中添加代码,读取local.properties中的密钥并生成到BuildConfig:
android {
    // ... 其他原有配置

    defaultConfig {
        // ... 其他原有配置

        // 读取local.properties中的API_KEY并注入BuildConfig
        Properties properties = new Properties()
        properties.load(project.rootProject.file("local.properties").newDataInputStream())
        buildConfigField("String", "API_KEY", "\"${properties.getProperty("API_KEY")}\"")
    }

    // ... 其他原有配置
}
  1. 替换Constants中的API_KEY
    把Constants类中的硬编码密钥替换为BuildConfig生成的值:
object Constants {
    const val BASE_URL = "https://api.themoviedb.org/3/"
    // 用BuildConfig生成的密钥替代硬编码值
    const val API_KEY = BuildConfig.API_KEY
    const val IMAGE_BASE_URL = "https://image.tmdb.org/t/p/w500"
    const val FAV_TABLE= "fav_table"
    const val FAV_DATABASE= "fav_database"
    const val NETWORK_TIMEOUT = 60L 
}

验证修复

  1. 清理并重新构建项目:执行Build -> Clean Project和Build -> Rebuild Project
  2. 生成签名Release包或App Bundle,安装到设备测试,此时请求会自动带上API密钥,应该能正常获取数据了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:52:49