Android端Amplify.Storage系列方法调用无响应问题排查咨询
AWS Amplify Android Storage 上传无响应排查方案
1. 协程调用逻辑校验
- 检查调用
storeAudio时使用的协程作用域是否处于活跃状态:如果绑定的Activity/Fragment已销毁、作用域提前调用cancel()方法,代码块内的上传逻辑根本不会执行,自然不会触发任何回调。可以在协程块第一行加日志确认代码是否实际走到了上传调用位置。
注意:回调版本的Storage API在非主线程调用时存在已知的回调丢失问题,生产环境建议优先使用官方协程扩展提供的挂起API,稳定性更高。
- 回调版本的
Amplify.Storage.uploadFile默认依赖主线程派发回调,如果你使用的协程上下文强制调度到无消息循环的子线程(比如自定义Dispatcher未关联Looper),会出现回调丢失、无任何日志的问题。优先替换为官方Kotlin扩展提供的挂起版本API(需依赖core-kotlin扩展库),避免回调线程问题:
// 协程作用域指定主线程,避免线程调度冲突 scope.launch(Dispatchers.Main) { // 提前校验文件有效性 val file = File(filePath) if (!file.exists() || !file.canRead()) { Log.e(TAG, "音频文件不可访问,路径:$filePath,存在状态:${file.exists()},可读状态:${file.canRead()}") return@launch } val options = StorageUploadFileOptions.builder() .accessLevel(StorageAccessLevel.PROTECTED) .build() try { val uploadOperation = Amplify.Storage.uploadFile(key, file, options) // 监听上传进度 uploadOperation.progress().collect { progress -> Log.i(TAG, "上传进度:${progress.fractionCompleted}") } // 等待上传结果 val result = uploadOperation.result() Log.i(TAG, "上传成功,文件key:${result.key}") } catch (e: StorageException) { Log.e(TAG, "上传失败", e) } }
2. 身份态与权限校验
- 你使用了
PROTECTED存储访问级别,该级别要求调用上传时用户必须处于有效登录状态:在上传逻辑前打印Amplify.Auth.currentUser确认当前存在有效认证会话,未登录状态下部分旧版本Amplify SDK不会抛出显式错误,会直接挂起请求无响应。 - 检查Android系统文件权限:Android 13及以上版本读取本地音频需要申请
READ_MEDIA_AUDIO运行时权限,Android 12及以下版本需要READ_EXTERNAL_STORAGE权限,未获取权限时File对象可正常实例化,但实际读取文件流时会静默失败,不触发任何回调。
3. 开启底层日志定位链路问题
- 你当前仅打印INFO及以上级别的业务日志,Amplify Storage模块的底层链路日志默认是DEBUG级别,需要在初始化Amplify时开启全量日志,才能看到被吞掉的错误信息:
// 放在所有Amplify插件注册之后、configure调用之前 Amplify.addPlugin(AndroidLoggingPlugin(Log.VERBOSE))
- 开启日志后重点筛选
AWSS3StoragePlugin、CognitoCredentialsProvider相关的输出,常见静默失败原因包括:Cognito身份池未给认证用户分配S3上传权限、S3桶策略配置错误、请求被网络策略拦截。
4. 配置文件校验
不要通过肉眼判断amplifyconfiguration.json无异常,重点核对以下字段:
awsS3StoragePlugin节点下的bucket字段值与实际S3桶名完全一致,无拼写错误、多余空格awsS3StoragePlugin节点下的region字段与S3桶实际部署区域完全匹配- 确认本地配置文件是云端资源部署完成后自动生成的最新版本,没有手动修改过字段值
内容的提问来源于stack exchange,提问作者Mmedara Josiah
相关产品推荐
相关产品推荐

