生成签名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来管理:
- 修改local.properties文件
在项目根目录的local.properties中添加你的API密钥(该文件默认不会被提交到版本控制):
API_KEY=你的实际TMDB密钥
- 修改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")}\"") } // ... 其他原有配置 }
- 替换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 }
验证修复
- 清理并重新构建项目:执行
Build -> Clean Project和Build -> Rebuild Project - 生成签名Release包或App Bundle,安装到设备测试,此时请求会自动带上API密钥,应该能正常获取数据了。
内容的提问来源于stack exchange,提问作者Berkay
相关产品推荐
相关产品推荐

