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)
原因分析
- 依赖版本冲突:google-cloud-storage 2.36.1依赖的Guava版本,与Android项目中其他依赖引入的Guava版本不兼容,导致
ImmutableList.toImmutableList()方法无法被目标类正常访问。而gsutil是独立运行工具,依赖环境与Android项目完全隔离,因此不会出现这类冲突。 - 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环境的官方封装,自动处理了适配、权限和线程调度问题,步骤如下:
- 添加依赖:
implementation 'com.google.firebase:firebase-storage:20.3.0' - 上传代码示例:
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
相关产品推荐
相关产品推荐

