Android集成Google Sheets API报错:Application Default Credentials不可用
问题原因
GoogleCredentials.getApplicationDefault() 是为服务器端或本地开发场景设计的,它会优先读取环境变量 GOOGLE_APPLICATION_CREDENTIALS 指定的路径,或者查找系统默认位置的凭证文件。但Android应用没有这种环境变量机制,也无法访问ADC预期的默认路径,所以会抛出「Application Default Credentials are not available」错误。你放在src\main\resources的json凭证文件,ADC根本找不到。
解决方案
1. 调整凭证文件位置
把下载的服务账号json文件移动到Android项目的src/main/res/raw目录(如果没有raw目录就新建一个),建议把文件名改成小写且无特殊字符,比如credentials.json。
2. 修改凭证加载代码
替换setRow方法里的凭证获取逻辑,手动从raw资源加载凭证:
private fun setRow(spreadSheetID: String, range: String, values: ValueRange) { try { // 从raw资源加载凭证文件 val inputStream = resources.openRawResource(R.raw.credentials) val credentials = GoogleCredentials.fromStream(inputStream) .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)) val requestInitializer: HttpRequestInitializer = HttpCredentialsAdapter(credentials) val service: Sheets = Sheets.Builder(NetHttpTransport(), GsonFactory.getDefaultInstance(), requestInitializer) .setApplicationName("FRCScout22") .build() service.spreadsheets().values().update(spreadSheetID, range, values) .setValueInputOption("USER_ENTERED") .execute(); } catch (e: Exception) { e.printStackTrace() // 这里可以添加错误提示,比如Toast告知用户写入失败 } }
3. 必要权限配置
确保AndroidManifest.xml中添加了网络权限:
<uses-permission android:name="android.permission.INTERNET" />
4. 服务账号权限配置
别忘了把服务账号的邮箱(在json文件里的client_email字段)添加到目标Google Sheets的共享列表中,赋予编辑权限,否则会出现权限不足的错误。
内容的提问来源于stack exchange,提问作者Elliot Scher
相关产品推荐
相关产品推荐

