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

Android上传文件至Google Cloud Storage失败问题及解决咨询

问题描述
  • 存储桶已设为公开状态,通过gsutil上传文件成功,执行命令:
    gsutil cp demo.mp4 gs://bucketname
    
  • Android项目中使用的google-cloud-storage版本为2.36.1,依赖配置:
    implementation "com.google.cloud:google-cloud-storage:2.36.1"
    
  • 已申请网络权限:
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    
  • 上传代码实现:
    Thread {
        val storage: Storage = StorageOptions.getDefaultInstance().service
        val file = Paths.get(getAbsolutePathFromUri(event.outputResults.outputUri))
        val bucketName = "backetname"
        val blobName = file.fileName.toString()
        val bucket = storage.get(bucketName)
        bucket.create(blobName, Files.readAllBytes(file))
    }.start()
    
  • 崩溃触发点:执行val bucket = storage.get(bucketName)时抛出错误:

    java.lang.IllegalAccessError: Method 'java.util.stream.Collector com.google.common.collect.ImmutableList.toImmutableList()' is inaccessible to class 'com.google.cloud.storage.UnifiedOpts$Opts' (declaration of 'com.google.cloud.storage.UnifiedOpts$Opts' appears in /data/app/~~k3FPbsvDs05Ol9WHS7nIQA==/com.android.example.camerax.video-Yn9EyF9sDYOAtVY7XEmMUw==/base.apk!classes8.dex)

原因分析
  1. 依赖版本冲突:google-cloud-storage 2.36.1依赖的Guava版本,与Android项目中其他依赖引入的Guava版本不兼容,导致ImmutableList.toImmutableList()方法无法被目标类正常访问。而gsutil是独立运行工具,依赖环境与Android项目完全隔离,因此不会出现这类冲突。
  2. JVM库适配问题:google-cloud-storage核心库是为标准JVM环境设计的,直接在Android中使用时,会遇到Java API(如Stream API)、类加载机制等方面的兼容性问题。
解决办法

方案一:修复Guava依赖冲突

在Module级别的build.gradle中添加依赖约束,强制统一项目使用适配Android的Guava版本:

configurations.all {
    resolutionStrategy.force 'com.google.guava:guava:32.1.3-android'
}

选择带-android后缀的Guava版本,确保与google-cloud-storage的依赖兼容。

方案二:使用Firebase Storage(推荐)

Firebase Storage是Google Cloud Storage针对Android环境的官方封装,自动处理了适配、权限和线程调度问题,步骤如下:

  1. 添加依赖:
    implementation 'com.google.firebase:firebase-storage:20.3.0'
    
  2. 上传代码示例:
    val storage = FirebaseStorage.getInstance()
    val storageRef = storage.getReferenceFromUrl("gs://bucketname")
    val fileRef = storageRef.child("demo.mp4")
    val fileUri = event.outputResults.outputUri
    
    fileRef.putFile(fileUri)
        .addOnSuccessListener {
            // 上传成功逻辑
        }
        .addOnFailureListener { e ->
            // 上传失败逻辑
        }
    

方案三:降级google-cloud-storage版本

尝试将google-cloud-storage版本降级至2.20.0以下,这些版本依赖的Guava版本更旧,与Android项目的冲突概率更低,但会损失部分新功能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 09:20:15