Hochladen von Bildern von Android zu GCS

Ich versuche, ein Bild von Android direkt auf Google Cloud Storage hochzuladen. Aber die API scheint nicht zu arbeiten. Sie haben einige Java-Beispiele, die an die App-Engine gebunden sind. Ich sehe kein Beispiel, das bewiesen ist, auf Android zu arbeiten.

Auf Android habe ich versucht, mit dem json api ein Bild hochzuladen. Ich kann ein Bildobjekt hochladen, aber es scheint korrupt zu sein. Darüber hinaus scheint das Erstellen des Authentifizierungs-Tokens auch schwierig zu sein.

Ich bin gerade damit fertig. Hat jemand auf dieser Erde jemals versucht, ein Bild / Video von Android mit Java-Client oder Json API hochzuladen und gelang es? Kann mir jemand in die richtige Richtung hinweisen. Es war eine sehr enttäuschende Erfahrung mit diesem Speicher-Api von Google. Bitte teilen Sie Ihre Erfahrungen mit, wenn jemand es tat. Unten ist der Code, den ich von Android ausprobiere, während ich versuche, die JSON API von GCS zu benutzen.

private static String uploadFile(RichMedia media) { DefaultHttpClient client = new DefaultHttpClient(); Bitmap bitmap = BitmapUtils.getBitmap(media.getLocalUrl()); HttpPost post = new HttpPost(GCS_ROOT + media.getLocalUrl() + "_" + System.currentTimeMillis()); if(media.getType() == RichMedia.RichMediaType.PICTURE) { post.setHeader("Content-Type", "image/jpeg"); } else { post.setHeader("Content-Type", "video/mp4"); } post.setHeader("Authorization", "AIzaSyCzdmCMwiMzl6LD7R2obF0xSgnnx5rEfeI"); //post.setHeader("Content-Length", String.valueOf(bitmap.getByteCount())); ByteArrayOutputStream stream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); byte[] byteArray = stream.toByteArray(); try { post.setEntity(new StringEntity(new Gson().toJson(byteArray).toString())); HttpResponse response = client.execute(post); BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); String eachLine = null; StringBuilder builder = new StringBuilder(); while ((eachLine = reader.readLine()) != null) { builder.append(eachLine); } Ld("response = " + builder.toString()); JSONObject object = new JSONObject(builder.toString()); String name = object.getString("name"); return name; } catch (IOException e) { L.print(e); } catch (JSONException e) { L.print(e); } return null; } 

Ich laufe hier in zwei Fragen.

  1. Die Datei, die auf den Server hochgeladen wurde, ist beschädigt. Es ist nicht das gleiche Bild, das ich hochgeladen habe. Es ist currupt

  2. Der Autorisierungsschlüssel läuft sehr oft ab. In meinem Fall verwende ich den von gsutil generierten Auth-Code.

  • Senden Sie Bilddaten an die Android App von App Engine
  • Zugriff auf Google Cloud Storage von Android OAuth2
  • Speichern von Android-Anwendungsdaten in Google Cloud
  • 5 Solutions collect form web for “Hochladen von Bildern von Android zu GCS”

    Da niemand diese Frage beantwortet, lass mich die Art aktualisieren, wie ich dieses Problem gelöst habe. Ich folgte folgend dem https://github.com/pliablematter/simple-cloud-storage Projekt.

    Ich könnte Bilder / Videos von meiner Android-App auf GCS hochladen.

    Für Android behoben:

    Android Studio config:

     dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile files('libs/android-support-v4.jar') compile files('google-play-services.jar') compile 'com.wu-man:android-oauth-client:0.0.3' compile 'com.google.apis:google-api-services-storage:v1-rev17-1.19.0' compile(group: 'com.google.api-client', name: 'google-api-client', version:'1.19.0'){ exclude(group: 'com.google.guava', module: 'guava-jdk5') } } 

    AndroidManifiest:

     <uses-permission android:name="android.permission.INTERNET"></uses-permission> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission> 

    Hauptimplementierung:

      new AsyncTask(){ @Override protected Object doInBackground(Object[] params) { try { CloudStorage.uploadFile("bucket-xxx", "photo.jpg"); } catch (Exception e) { if(DEBUG)Log.d(TAG, "Exception: "+e.getMessage()); e.printStackTrace(); } return null; } }.execute(); 

    CloudStorage Klasse:

     import com.google.api.services.storage.Storage; import com.google.api.services.storage.StorageScopes; import com.google.api.services.storage.model.Bucket; import com.google.api.services.storage.model.StorageObject; public static void uploadFile(String bucketName, String filePath)throws Exception { Storage storage = getStorage(); StorageObject object = new StorageObject(); object.setBucket(bucketName); File sdcard = Environment.getExternalStorageDirectory(); File file = new File(sdcard,filePath); InputStream stream = new FileInputStream(file); try { String contentType = URLConnection.guessContentTypeFromStream(stream); InputStreamContent content = new InputStreamContent(contentType,stream); Storage.Objects.Insert insert = storage.objects().insert(bucketName, null, content); insert.setName(file.getName()); insert.execute(); } finally { stream.close(); } } private static Storage getStorage() throws Exception { if (storage == null) { HttpTransport httpTransport = new NetHttpTransport(); JsonFactory jsonFactory = new JacksonFactory(); List<String> scopes = new ArrayList<String>(); scopes.add(StorageScopes.DEVSTORAGE_FULL_CONTROL); Credential credential = new GoogleCredential.Builder() .setTransport(httpTransport) .setJsonFactory(jsonFactory) .setServiceAccountId(ACCOUNT_ID_PROPERTY) //Email .setServiceAccountPrivateKeyFromP12File(getTempPkc12File()) .setServiceAccountScopes(scopes).build(); storage = new Storage.Builder(httpTransport, jsonFactory, credential).setApplicationName(APPLICATION_NAME_PROPERTY) .build(); } return storage; } private static File getTempPkc12File() throws IOException { // xxx.p12 export from google API console InputStream pkc12Stream = AppData.getInstance().getAssets().open("xxx.p12"); File tempPkc12File = File.createTempFile("temp_pkc12_file", "p12"); OutputStream tempFileStream = new FileOutputStream(tempPkc12File); int read = 0; byte[] bytes = new byte[1024]; while ((read = pkc12Stream.read(bytes)) != -1) { tempFileStream.write(bytes, 0, read); } return tempPkc12File; } 

    Dieser Snippet von Code funktioniert für mich toll für das Hochladen von Dateien von Android direkt auf GCS.

     File file = new File(Environment.getExternalStorageDirectory(), fileName); HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(url); FileBody filebody = new FileBody(file,ContentType.create(mimeType), file.getName()); MultipartEntityBuilder multipartEntity = MultipartEntityBuilder.create(); multipartEntity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); multipartEntity.addPart("file", filebody); httppost.setEntity(multipartEntity.build()); System.out.println( "executing request " + httppost.getRequestLine( ) ); try { HttpResponse response = httpclient.execute( httppost ); Log.i("response", response.getStatusLine().toString()); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } httpclient.getConnectionManager( ).shutdown( ); 

    MultipartEntityBuilder-Klasse ist nicht in Android-Bibliotheken enthalten, so dass Sie httpclient herunterladen und in Ihr Projekt einbinden müssen.

    Hpsaturns Antwort hat für mich gearbeitet. Er hat es versäumt, ein paar Punkte zu beantworten. Wie bekomme ich Dienstkonto-ID und p12-Datei. Für diese 2, öffnen Sie console.developers.google.com und wählen Sie Ihr Projekt. Cloud Storage-API aktivieren. Sie sehen eine Nachricht zum Erstellen von Anmeldeinformationen. Gehen Sie zu den Anmeldeinformationen im API-Manager und erstellen Sie die Anmeldeinformationen, indem Sie den Dienstkontoschlüssel auswählen und den Details im Bild folgen. Sie erhalten die Dienstkonto-ID und die p12-Datei von diesem Bildschirm.

    Bildbeschreibung hier eingeben

    Hpsaturn verpasste auch AppData, was Ihre benutzerdefinierte Anwendungsklasse in Manifest definiert ist. Für jedermanns Bequemlichkeit füge ich die komplette CloudStorage Klasse hier an.

     package com.abc.xyz.utils; import android.net.Uri; import android.os.Environment; import android.util.Log; import com.abc.xyz.app.AppController; import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; import com.google.api.client.http.HttpTransport; import com.google.api.client.http.InputStreamContent; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; import com.google.api.client.json.jackson2.JacksonFactory; import com.google.api.services.storage.Storage; import com.google.api.services.storage.StorageScopes; import com.google.api.services.storage.model.StorageObject; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URLConnection; import java.util.ArrayList; import java.util.List; /** * Created by wjose on 8/20/2016. */ public class CloudStorage { private static final String TAG = "CloudStorage"; public static void uploadFile(String bucketName, String name, Uri uri)throws Exception { Storage storage = getStorage(); StorageObject object = new StorageObject(); object.setBucket(bucketName); File sdcard = Environment.getExternalStorageDirectory(); //File file = new File(sdcard,filePath); File file = new File(uri.getPath()); InputStream stream = new FileInputStream(file); try { String contentType = URLConnection.guessContentTypeFromStream(stream); InputStreamContent content = new InputStreamContent(contentType,stream); Storage.Objects.Insert insert = storage.objects().insert(bucketName, null, content); insert.setName(name); StorageObject obj = insert.execute(); Log.d(TAG, obj.getSelfLink()); } finally { stream.close(); } } static Storage storage = null; private static Storage getStorage() throws Exception { if (storage == null) { HttpTransport httpTransport = new NetHttpTransport(); JsonFactory jsonFactory = new JacksonFactory(); List<String> scopes = new ArrayList<String>(); scopes.add(StorageScopes.DEVSTORAGE_FULL_CONTROL); Credential credential = new GoogleCredential.Builder() .setTransport(httpTransport) .setJsonFactory(jsonFactory) .setServiceAccountId("myuser-801@xxxyyyzzz.iam.gserviceaccount.com") //Email .setServiceAccountPrivateKeyFromP12File(getTempPkc12File()) .setServiceAccountScopes(scopes).build(); storage = new Storage.Builder(httpTransport, jsonFactory, credential).setApplicationName("MyApp") .build(); } return storage; } private static File getTempPkc12File() throws IOException { // xxx.p12 export from google API console InputStream pkc12Stream = MyApplication.getInstance().getAssets().open("xxxyyyzzz-0c80eed2e8aa.p12"); File tempPkc12File = File.createTempFile("temp_pkc12_file", "p12"); OutputStream tempFileStream = new FileOutputStream(tempPkc12File); int read = 0; byte[] bytes = new byte[1024]; while ((read = pkc12Stream.read(bytes)) != -1) { tempFileStream.write(bytes, 0, read); } return tempPkc12File; } } 

    Btb, ich habe nur folgende abhängigkeit im gradle verwendet.

    Compile 'com.google.apis: google-api-services-storage: +'

    Ich habe alle oben genannten Antworten ausprobiert und keiner von ihnen arbeitete für mich direkt aus der Box. Hier ist was ich getan habe, um es zu machen (nur durch Bearbeiten aus den obigen Kommentaren):

     package Your page name; import android.app.Activity; import android.content.res.AssetManager; import android.os.Environment; import android.util.Log; import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; import com.google.api.client.http.HttpTransport; import com.google.api.client.http.InputStreamContent; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; import com.google.api.client.json.jackson2.JacksonFactory; import com.google.api.services.storage.Storage; import com.google.api.services.storage.StorageScopes; import com.google.api.services.storage.model.Bucket; import com.google.api.services.storage.model.StorageObject; import java.io.File; import java.io.*; import java.io.InputStream; import java.net.URLConnection; import java.util.ArrayList; import java.util.List; public class CloudStorage { static Activity activity=null; //http://stackoverflow.com/questions/18002293/uploading-image-from-android-to-gcs static Storage storage=null; public static void uploadFile(Activity activity2,String bucketName, String filePath) { activity=activity2; try { Storage storage = getStorage(); StorageObject object = new StorageObject(); object.setBucket(bucketName); File sdcard = Environment.getExternalStorageDirectory(); File file = new File(filePath); InputStream stream = new FileInputStream(file); try { Log.d("Alkamli","Test"); String contentType = URLConnection.guessContentTypeFromStream(stream); InputStreamContent content = new InputStreamContent(contentType, stream); Storage.Objects.Insert insert = storage.objects().insert(bucketName, null, content); insert.setName(file.getName()); insert.execute(); } finally { stream.close(); } }catch(Exception e) { class Local {}; Log.d("Alkamli","Sub: "+Local.class.getEnclosingMethod().getName()+" Error code: "+e.getMessage()); e.printStackTrace(); } } private static Storage getStorage() { try { if (storage == null) { HttpTransport httpTransport = new NetHttpTransport(); JsonFactory jsonFactory = new JacksonFactory(); List<String> scopes = new ArrayList<String>(); scopes.add(StorageScopes.DEVSTORAGE_FULL_CONTROL); Credential credential = new GoogleCredential.Builder() .setTransport(httpTransport) .setJsonFactory(jsonFactory) .setServiceAccountId("Service-Email-Address") //Email .setServiceAccountPrivateKeyFromP12File(getTempPkc12File()) .setServiceAccountScopes(scopes).build(); storage = new Storage.Builder(httpTransport, jsonFactory, credential) .build(); } return storage; }catch(Exception e) { class Local {}; Log.d("Alkamli","Sub: "+Local.class.getEnclosingMethod().getName()+" Error code: "+e.getMessage()); } Log.d("Alkamli","Storage object is null "); return null; } private static File getTempPkc12File() { try { // xxx.p12 export from google API console InputStream pkc12Stream = activity.getResources().getAssets().open("Service-key.p12"); File tempPkc12File = File.createTempFile("temp_pkc12_file", "p12"); OutputStream tempFileStream = new FileOutputStream(tempPkc12File); int read = 0; byte[] bytes = new byte[1024]; while ((read = pkc12Stream.read(bytes)) != -1) { tempFileStream.write(bytes, 0, read); } return tempPkc12File; }catch(Exception e) { class Local {}; Log.d("Alkamli","Sub: "+Local.class.getEnclosingMethod().getName()+" Error code: "+e.getMessage()); } Log.d("Alkamli"," getTempPkc12File is null"); return null; } } 

    Ich habe nur wenige Zeilen bearbeitet, um es für mich zu arbeiten und für die Abhängigkeiten in gradle Du brauchst nur diese drei. (Denken Sie daran, dass, wenn Sie alle Google depenacnes verwenden, die Ihr ganzes Projekt beschädigen können. In meinem Fall würden einige der Funktionen von android nicht mehr funktionieren)

      compile 'com.google.api-client:google-api-client:1.20.0' compile 'com.google.oauth-client:google-oauth-client-jetty:1.20.0' compile 'com.google.apis:google-api-services-storage:v1-rev17-1.19.0' 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.