1

我一直无法找到关于如何从Android应用程序使用云存储的具体文档。从Android访问云存储

我确实遇到了Google Cloud SDK中的this client library,但遇到了很多很多问题,但尚未解决问题。

添加以下代码在上面的链接推荐:

的build.gradle

compile group: 'com.google.cloud', name: 'google-cloud-storage', version: '0.9.3-beta' 

我加入一些简单的代码,虽然这不是真正相关的这个问题,因为我还没有能够运行我的应用程序与上述依赖项添加:

在一个活动时间:

Storage storage = StorageOptions.getDefaultInstance().getService(); 
Page<Bucket> buckets = storage.list(); 
Iterator<Bucket> bucketIterator = buckets.iterateAll(); 
while (bucketIterator.hasNext()) { 
    Bucket bucket = bucketIterator.next(); 
    Log.d(TAG, "Bucket name: " + bucket.getName()); 
} 

解决的依赖问题无数(与乔达,Netty的,DuplicateFileException“从gradle这个S等冲突),我是能够建立项目,尽管下面的错误后:

Warning:WARNING: Dependency org.apache.httpcomponents:httpclient:4.0.1 is ignored for debug as it may be conflicting with the internal version provided by Android. Warning:WARNING: Dependency org.json:json:20151123 is ignored for debug as it may be conflicting with the internal version provided by Android.

然后我可以尝试运行,这将失败,几百个错误,其中大部分看起来像下面这样:

Error:warning: Ignoring InnerClasses attribute for an anonymous inner class 
Error:(com.google.inject.internal.cglib.reflect.$FastClassEmitter$3) that doesn't come with an 
Error:associated EnclosingMethod attribute. This class was probably produced by a 
Error:compiler that did not target the modern .class file format. The recommended 
Error:solution is to recompile the class from source, using an up-to-date compiler 
Error:and without specifying any "-target" type options. The consequence of ignoring 
Error:this warning is that reflective operations on this class will incorrectly 
Error:indicate that it is *not* an inner class. 

不少这些之后,具有不同的类名,错误的末尾包含这样的:

故障处理“的javax /交易/ HeuristicCommitException.class”:

不明智或当 未构建核心库时,错误地使用核心类(java。*或javax。*)。

这通常是由于在使用IDE(如Eclipse)时,无意中在您的应用程序的项目中包含了一个核心库文件 。如果 你确定你不是故意定义一个核心类,那么这个 是最可能的解释。

但是,您可能实际上正在尝试在核心 名称空间中定义一个类,该名称空间的来源可能来自例如 非Android虚拟机项目。这肯定不会是 的工作。至少,它会危害您的应用程序与未来版本的平台的兼容性。它也常常是有问题的合法性。

如果你真的打算建立一个核心库 - 这是只有 适合作为创建一个完整的虚拟机分配, 而不是编译应用程序的一部分 - 然后使用 “--core库”选项来抑制此错误消息。

如果你继续使用“--core库”,但事实上是构建 应用程序,然后谅解,您的应用程序仍然会失败 建设或运行,在某些时候。请为愤怒的客户 做好准备,例如,他们发现您的应用程序在他们升级其操作系统后不再起作用 。你将被责怪这个 的问题。

如果您正在使用恰巧位于核心 包中的某些代码,那么最简单的安全替代方法是将该代码重新包装为 。也就是说,将有问题的类移动到您自己的包 名称空间中。这意味着他们永远不会与系统类核心 发生冲突。 JarJar是一个可以帮助你完成这项工作的工具。 如果您发现自己无法做到这一点,那么这表明您所走的路径最终会导致疼痛,痛苦,悲伤,悲伤和悲伤。

几个问题:

  1. 这是客户端库从我的Android应用程序访问我的谷歌云存储的正确方法?
  2. 是否有我不应该尝试从移动应用程序访问云存储的原因?例如,如果更好的体系结构是对我的App Engine应用程序(使用Cloud Enpoints)进行REST API调用并将其传递给媒体对象,然后让App Engine应用程序访问并将媒体存储在Cloud Storage中,然后再最终返回结果移动应用程序?
  3. 如果我正确访问云存储,使用提到的客户端库,这些错误意味着什么,以及它修复了什么?
+0

你的用例是什么?正确的访问方法取决于你想要做什么。 – BrettJ

+0

在这一点上,我会解决任何类型的连接到我的云存储。如代码片段所示,我只是试图列出存储桶名称。我的“最终”用例是上传/下载视频。 – Orbit

回答

1

我猜,但我认为火力地堡存储API是为了做这个你应该的方式: https://firebase.google.com/docs/storage/

+1

我目前没有在我的应用程序的任何地方使用Firebase。我知道Firebase存储由Google云端存储提供支持,但Firebase不是Google云端平台的产品,我非常怀疑您是如何访问云存储存储区的。虽然我很欣赏答案。 – Orbit

1

你不应该从客户端应用程序直接写入到云端存储空间,不可信任您的安全令牌。这听起来像你不打算直接作为用户进行身份验证,而是通常与你自己的项目进行身份验证。

如果您不打算开发基于用户的OAuth2流(用户必须拥有自己的云控制台项目,并且已启用存储),那么您需要通过自己的后端代理请求,例如App Engine 。

这种方法可以让您的存储凭证安全地存储在服务器端,而不是存储在客户端应用的APK中,该应用可以被拆除,解压缩,然后恶意的角色可以使用这些凭据以任何他们选择的方式写入您的存储桶。哦,存储桶和存储是一项可收费的资源,因此暴露这些凭据可能会让您付出代价。

这是来自移动设备的许多云服务的常见模式,您将希望通过自己的后端或API路由请求。

+0

因此,您是在说我需要向App Engine应用程序发出请求,并与云存储进行通信?从移动应用程序直接与Cloud Storage进行通信是不可能的。例如,Firebase存储位于云端存储的后端,但我可以直接从移动应用程序上传和下载对象。给出你的答案,那不是安全问题? – Orbit

+1

是的,如果您要使用云端存储,那就是我所说的。 Firebase存储利用Android的Firebase身份验证处理安全性,该安全性依赖于我认为位于GMS核心库中的Android身份验证机制。 如果你真的想要云存储,你将不得不推出自己的代理。为什么不使用Firebase存储?即使它不是云品牌服务,它仍然是另一种普遍可用的Google服务。 – BrettJ

+0

由于Firebase存储由云存储支持,因此我的困惑仍在继续。如果我使用Firebase存储存储某些内容,则可以转至Google Cloud Platform控制台,导航至云端存储,并在存储区中使用通过Firebase存储添加的项目。我不明白为什么直接使用GCS会有什么不同。我对使用Firebase存储的犹豫是为了尽量避免使用尽可能多的第三方服务,特别是当某些Firebase功能可能与App Engine冲突(例如禁用App Engine自动缩放的Firebase侦听器)时。 – Orbit

相关问题