根据阿里云OSS SDK README文档的逐步检查,我已经完成了以下修复和改进:
- ✅ 添加了
WRITE_EXTERNAL_STORAGE权限到AndroidManifest.xml - ✅ 确认了
INTERNET权限已存在
- ✅ 更新STS_BASE_URL使用HTTPS:
https://dev-inkcre-sts.zeabur.app/ - ✅ 更新STS_ROLE为正确的角色名:
oss_normal_op(根据API文档)
- ✅ 创建了正确的STSResponse数据模型,匹配阿里云API文档格式:
data class STSResponse(
val SecurityToken: String,
val Expiration: String,
val AccessKeySecret: String,
val AccessKeyId: String
)- ✅ 使用了正确的阿里云OSS SDK API
- ✅ 实现了标准的STS凭证初始化流程
- ✅ 添加了上传进度回调
- ✅ 优化了错误处理
- ✅ 添加了多路径尝试机制
- ✅ 实现了模拟STS凭证作为临时解决方案
- ✅ 增强了错误日志和调试信息
- ✅ 创建了
OSSServiceDiagnostic全面诊断工具 - ✅ 集成了长按诊断功能到相机界面
通过测试发现,主要问题是:
# 测试结果显示
curl "https://dev-inkcre-sts.zeabur.app/"
# 返回: 500 Internal Server Error
curl "https://dev-inkcre-sts.zeabur.app/thrid_party/aliyun/sts/oss_normal_op?duration=3600"
# 返回: 404 Not Found结论: STS服务本身存在问题,可能是:
- 服务未正确部署
- API路径配置错误
- 服务内部错误
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home
./gradlew assembleDebug
adb install app/build/outputs/apk/debug/app-debug.apk- 打开应用
- 长按右下角的灰色按钮(toggleOverlayButton)
- 等待Toast提示"OSS诊断完成"
- 查看日志输出
adb logcat | grep -E "(OSSServiceDiagnostic|STSService|OSSUploadService)"- 拍摄照片
- 观察上传结果
- 查看相关日志
诊断工具会检查:
-
配置检查
- STS_BASE_URL
- STS_ROLE
- ENDPOINT
- BUCKET_NAME
- UPLOAD_FOLDER
-
网络连接测试
- 基础网络连通性
-
STS服务基础连接
- STS服务器响应状态
-
STS API路径测试
- 多种可能的API路径
- 响应状态和内容
-
OSS Endpoint连通性
- 阿里云OSS服务连接
-
问题分析和建议
- 自动分析问题原因
- 提供解决建议
由于STS服务不可用,我实现了模拟STS凭证机制:
在STSService.kt中:
companion object {
private const val USE_MOCK_STS = true // 设置为true使用模拟凭证
}val mockResponse = STSResponse(
SecurityToken = "mock_security_token_for_testing",
Expiration = "2025-12-31T23:59:59Z",
AccessKeySecret = "mock_access_key_secret",
AccessKeyId = "mock_access_key_id"
)注意: 模拟凭证仅用于测试OSS上传流程,实际上传会失败,因为凭证无效。
- 运行诊断工具 - 长按右下角按钮获取完整报告
- 检查STS服务 - 联系STS服务提供方确认服务状态
- 验证API路径 - 确认正确的API endpoint和路径
- 关闭模拟模式 - 设置
USE_MOCK_STS = false - 测试真实凭证 - 验证STS服务返回有效凭证
- 完整功能测试 - 测试端到端的上传流程
根据诊断结果,可能需要调整:
- API路径格式
// 可能的正确路径格式
"api/v1/thrid_party/aliyun/sts/${OSSConfig.STS_ROLE}?duration=3600"
"v1/thrid_party/aliyun/sts/${OSSConfig.STS_ROLE}?duration=3600"- 角色名称
// 可能需要的角色名
const val STS_ROLE = "oss" // 原始角色名
const val STS_ROLE = "oss_upload" // 上传专用角色
const val STS_ROLE = "OSS" // 大写格式- 请求头配置
// 可能需要的请求头
.addHeader("Content-Type", "application/json")
.addHeader("Accept", "application/json")如果问题仍然存在,请提供:
- 完整的诊断日志 - 运行诊断工具的输出
- STS服务状态 - 服务提供方的确认
- API文档 - 最新的STS API文档
- 错误截图 - 应用中的错误提示
修复完成的标志:
- ✅ 诊断工具显示所有检查通过
- ✅ STS API返回有效凭证
- ✅ 照片上传成功并返回URL
- ✅ 应用中显示"上传成功"提示
当前状态: 代码已优化,等待STS服务修复后进行完整测试。
建议: 立即运行诊断工具获取详细报告,然后联系STS服务提供方解决服务问题。