Android使用Azure Blob Storage SDK获取Blob属性时参数错误问题
问题解决思路
1. getLastModified()/getCreationTime() 参数错误问题
这个错误是ProGuard/R8混淆破坏了Azure SDK方法签名导致的。Azure Storage SDK的BlobProperties类方法在未配置正确混淆规则时,会被R8篡改方法签名,让原本无参的方法变成需要传入参数的形式。
解决方法:在项目的proguard-rules.pro中添加以下混淆规则:
-keep class com.azure.storage.** { *; } -keep interface com.azure.storage.** { *; } -keep class com.azure.core.** { *; } -keep interface com.azure.core.** { *; }
如果使用R8全模式(fullMode),还需额外添加:
-keepattributes Signature, InnerClasses, EnclosingMethod
添加后重新编译打包,即可恢复方法的正确签名。
2. containerClient.listBlobs()无返回结果问题
默认listBlobs()仅列出容器根目录下的Blob,且需处理分页结果(Azure SDK返回的是PagedIterable,单页可能为空但后续页有数据);若要列出子目录下的Blob,必须配置递归参数。
正确调用方式:
// 配置递归列出所有层级Blob,处理分页 ListBlobsOptions options = new ListBlobsOptions() .setRecursive(true) .setPrefix(""); // 可设置前缀过滤特定路径的Blob PagedIterable<BlobItem> blobItems = containerClient.listBlobs(options, Duration.ofSeconds(30)); for (BlobItem blobItem : blobItems) { Log.d("Blob", "名称:" + blobItem.getName()); // 其他业务操作 }
若仍无结果,排查以下点:
- 容器名称是否正确(注意大小写敏感)
- Blob是否匹配设置的前缀路径(如果配置了
prefix) - 客户端权限是否足够(SAS令牌或连接字符串需包含
Storage Blob Data Reader及以上权限)
额外排查:
你提到Azure门户显示请求已到达,可查看存储账户的操作日志,检查listBlobs请求的响应状态码:
- 若为200但返回空列表,说明当前查询条件下无匹配Blob
- 若为4xx/5xx,根据错误码排查权限或服务端异常
内容的提问来源于stack exchange,提问作者Alexander Jæger
相关产品推荐
相关产品推荐

