Subiendo imagen de Android a GCS

Estoy intentando subir una imagen de Android directamente al almacenamiento en la nube de Google. Pero la API no parece funcionar. Tienen algunas muestras de Java que están vinculadas al motor de la aplicación. No veo ninguna muestra que funcione en Android.

En Android, traté de usar la aplicación json para subir una imagen. Puedo subir un objeto de imagen pero parece estar dañado. Además, generar el token de autenticación parece ser complicado también.

Estoy sorprendido con esto ahora mismo. ¿Alguien en este mundo alguna vez intentó subir una imagen / video de Android utilizando el cliente Java o la API Json y tuvo éxito? ¿Puede alguien señalarme en la dirección correcta, por favor? Ha sido una experiencia muy decepcionante con esta API de almacenamiento de Google. Por favor comparta sus experiencias si alguien lo hizo. A continuación se muestra el código que estoy tratando de Android al tratar de usar la API JSON de la GCS.

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; } 

Me encuentro con dos problemas aquí.

  1. El archivo que se subió al servidor está dañado. No es la misma imagen que cargué. Esta en bancarrota

  2. La clave de autorización caduca muy a menudo. En mi caso, estoy usando el código de autenticación generado por gsutil.

    Como nadie responde esta pregunta, permítanme actualizar la forma en que resolví este problema. Terminé siguiendo este https://github.com/pliablematter/simple-cloud-storage proyecto.

    Podría subir fotos / videos a GCS desde mi aplicación de Android.

    Solucionado para Android:

    Configuración de Android Studio:

     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:

       

    Implementación principal:

      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(); 

    Clase CloudStorage:

     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 scopes = new ArrayList(); 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; } 

    Este fragmento de código me funciona muy bien para cargar archivos de Android directamente a 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( ); 

    La clase MultipartEntityBuilder no está incluida en las bibliotecas estándar de Android, por lo que debe descargar httpclient e incluirla en su proyecto.

    La respuesta de Hpsaturn funcionó para mí. Echó de menos responder algunos puntos. Cómo obtener la identificación de la cuenta de servicio y el archivo p12. Para obtener estos 2, abra console.developers.google.com y elija su proyecto. Habilitar Cloud Storage API. Usted ve un mensaje para crear credenciales. Vaya a las credenciales en el administrador de la API y cree una credencial seleccionando la clave de la cuenta de servicio y siga los detalles en la imagen. Obtendrá la identificación de la cuenta de servicio y el archivo p12 desde esta pantalla.

    enter image description here

    Hpsaturn también olvidó mencionar AppData, que es su clase de aplicación personalizada definida en manifiesto. Para su conveniencia, adjunto la clase completa de CloudStorage aquí.

     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 scopes = new ArrayList(); 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, utilicé solo la siguiente dependencia en el gradle.

    compile ‘com.google.apis: google-api-services-storage: +’

    He intentado todas las respuestas anteriores y ninguna de ellas funcionó para mí nada más sacarlas de la caja. Esto es lo que he hecho para que funcione (solo editando los comentarios anteriores):

     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 scopes = new ArrayList(); 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; } } 

    Solo edité algunas líneas para que funcione para mí y para las dependencias de gradle. Necesitarás solo estas tres. (Tenga en cuenta que si utiliza todos los depenecnos de google que pueden dañar todo su proyecto, en mi caso algunas de las funciones de Android ya no funcionarían)

      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'