从Android访问云存储

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

我确实遇到了来自Google Cloud SDK的这个客户端库 ,但是遇到了很多很多问题并且还没有让它运行起来。

我在上面的链接中添加了以下代码:

build.gradle

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

然后我添加了一些简单的代码,虽然这与这个问题并不相关,因为我已经能够运行我的应用程序并添加了上面的依赖项:

在活动中:

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

解决了无数的依赖问题(与Joda冲突,Netty, DuplicateFileException来自gradle等)我能够构建项目,尽管有以下错误:

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 / transaction / HeuristicCommitException.class”:

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

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

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

如果您真的打算构建一个核心库 – 它只适合作为创建完整虚拟机分发的一部分,而不是编译应用程序 – 那么使用“–core-library”选项来抑制此错误消息。

如果你继续使用“–core-library”但实际上正在构建一个应用程序,那么预先警告你的应用程序在某些时候仍然无法构建或运行。 请为愤怒的客户做好准备,例如,一旦升级操作系统,您的应用程序就会停止运行。 你应该为这个问题负责。

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

几个问题:

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

您不应该从无法使用安全令牌信任的客户端应用程序直接写入云存储。 听起来您并不打算直接以用户身份进行身份validation,而是通常使用自己的项目进行身份validation。

如果您不打算执行基于用户的OAuth2流程(用户必须在启用了Storage的情况下拥有自己的Cloud Console项目),那么您需要通过自己的后端(如App Engine)代理请求。

这种方法可以将您的存储凭据安全地存储在服务器端而不是客户端应用程序的APK中,这可以被拆除,提取,然后恶意攻击者可以使用这些凭据以他们选择的任何方式写入您的存储桶。 哦,存储桶和存储是一个可计费的资源,因此暴露这些凭据可能会花费你。

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

我猜,但我认为 Firebase Storage API是您应该这样做的方式: https : //firebase.google.com/docs/storage/