从Android访问云存储

时间:2017-03-04 22:01:48

标签: java android google-app-engine google-cloud-storage google-cloud-platform

我一直无法找到有关如何从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());
}

解决了无数的依赖问题(与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.

经过不同的类名后,错误的结尾包含了以下内容:

  

麻烦处理&#34; javax / transaction / HeuristicCommitException.class&#34;:

     

错误使用或错误使用核心类(java。*或javax。*)时   没有建立核心库。

     

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

     

但是,您实际上可能正在尝试在核心中定义类   命名空间,例如,来自a的源代码   非Android虚拟机项目。这肯定不会   工作。它至少会危害您的应用与您的兼容性   该平台的未来版本。它也常常值得怀疑   合法性。

     

如果你真的打算建立一个核心库 - 这只是   适合作为创建完整虚拟机分发的一部分,   而不是编译应用程序 - 然后使用   &#34; - 核心库&#34;选项以禁止显示此错误消息。

     

如果你继续使用&#34; - core-library&#34;但实际上正在构建一个   应用程序,然后预先警告您的应用程序仍将失败   在某些时候建立或运行。请为愤怒的顾客做好准备   例如,谁发现你的申请不再运作一次   他们升级他们的操作系统。你应该为此负责   问题

     

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

几个问题:

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

2 个答案:

答案 0 :(得分:2)

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

如果您不打算执行基于用户的OAuth2流程(用户必须拥有自己的云控制台项目并启用了存储),那么您正在寻找通过您自己的后端(如App Engine)代理请求。

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

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

答案 1 :(得分:1)

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