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