【发布时间】:2017-07-24 22:09:45
【问题描述】:
我一直找不到任何关于如何从 Android 应用程序使用 Cloud Storage 的具体文档。
我确实遇到了来自 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's from 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)时。如果 你确定你不是故意定义一个核心类,那么这个 是对正在发生的事情的最可能的解释。
但是,您实际上可能正在尝试在核心中定义一个类 命名空间,您可能已经获取了它的来源,例如,从 非安卓虚拟机项目。这肯定不会 工作。至少,它会危害您的应用程序与 平台的未来版本。它也经常是有问题的 合法性。
如果你真的打算建立一个核心库——这只是 适合作为创建完整虚拟机分发的一部分, 而不是编译应用程序 - 然后使用 “--core-library”选项来禁止显示此错误消息。
如果您继续使用“--core-library”,但实际上是在构建一个 应用程序,然后预先警告您的应用程序仍然会失败 在某个时候构建或运行。请为愤怒的顾客做好准备 例如,他们发现您的应用程序停止运行一次 他们升级他们的操作系统。你将为此负责 问题。
如果您合法地使用某些恰好位于核心中的代码 包装,那么您拥有的最简单安全的替代方法是重新包装 那个代码。也就是说,将有问题的类移动到您自己的包中 命名空间。这意味着它们永远不会与核心冲突 系统类。 JarJar 是一个可以帮助您完成这项工作的工具。 如果你发现你不能做到这一点,那么这表明你 你所走的道路最终会导致痛苦、苦难、悲伤, 和悲叹。
几个问题:
- 此客户端库是从我的 Android 应用程序访问我的 Google Cloud Storage 的正确方法吗?
- 我是否有理由不尝试从移动应用程序访问云存储?例如,更好的架构是对我的 App Engine 应用程序(使用 Cloud Enpoints)进行 REST API 调用并将媒体对象传递给它,然后让 App Engine 应用程序访问并将媒体存储在 Cloud Storage 中,最后返回结果到移动应用?
- 如果我使用上述客户端库正确访问 Cloud Storage,这些错误是什么意思,以及解决方法是什么?
【问题讨论】:
-
您的用例是什么?正确的访问方法取决于您要执行的操作。
-
此时我会接受任何类型的与我的云存储的连接。如代码 sn-p 所示,我只是想列出存储桶名称。我的“最终”用例将是上传/下载视频。
标签: java android google-app-engine google-cloud-storage google-cloud-platform