我正在尝试将Firebase与Android应用程序一起使用,以连接到gs:// gcp-public-data-goes-16上用于GOES-16卫星数据的NOAA的公共存储桶,然后获取一个可供我随后使用的StorageReference浏览存储桶的内容并在其ABI-L2-ACMC目录下获取最新文件。
问题是,所有Firebase“入门”示例似乎都假设我想连接到存储桶I拥有,而不是存储桶somebody else拥有并可供使用公众。
基本上,我遇到了似乎是安全性,授权,权利和/或配置问题。
错误消息的文本表明这是存储分区的配置存在问题,但是我暂时假设NOAA知道它在做什么,而问题实际上就在我的末端(我的代码,我的应用程序的Firebase控制台设置或两者)。
我感觉这个项目变得完全没有希望了。
事实证明,要访问存储桶及其中的文件,您必须登录Google帐户。好的,没问题...我有一个,就像每个拥有Android手机的人一样。然后,我遇到了一个看似无法逾越的砖墙,实际上更像是三峡大坝。
根据https://firebase.google.com/docs/auth/android/google-signin中的说明,除非您自己(以SHA1 Android签名证书的形式)由GCP存储桶的所有者明确列入白名单,否则您似乎无法从客户端登录。因为我不是它的所有者,所以发生这种情况的可能性几乎为零。
情况真的完全没有希望吗?此刻,看来我唯一的选择可能是做些非常糟糕的事情,例如让用户使用手机的浏览器手动获取数据文件(可以登录Google并避开客户端白名单限制)并将其保存到手机的/ Download目录本身。这将使该应用程序难以使用,由于易用性,我给它加了两颗星。 :-(
FirebaseStorage storage = FirebaseStorage.getInstance("gs://gcp-public-data-goes-16");
StorageReference storageRef = storage.getReference();
storageRef.listAll().addOnSuccessListener(new OnSuccessListener<ListResult>() {
@Override
public void onSuccess(ListResult result) {
for (StorageReference fileRef : result.getItems()) {
Log.i("test", fileRef.toString());
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception exception) {
Log.e("test", "error listing bucket contents");
}
});
java.io.IOException:{“错误”:{“代码”:400,“消息”:“您的存储桶尚未为Firebase存储正确设置。请访问'https://console.firebase.google.com/project/gcp-public-data---goes-16/storage/files'自动修复此问题,并然后重试。如果问题持续时间超过五分钟,则您可能没有足够的权限来修复该项目。您可以通过访问“ https://console.firebase.google.com/iam-admin/iam/project?project=gcp-public-data---goes-16”来检查权限。” }}
您可以使用Google Cloud Services Java库来访问公共存储桶将此依赖项添加到您的Android应用程序的gradle中:
implementation 'com.google.cloud:google-cloud-storage:1.108.0'
检查此Accessing public data。如果要存储对象,请签出Downloading objects。