usage how google android google-cloud-storage google-api-java-client

how - Cargando imagen de Android a GCS



upload file to google cloud storage php (5)

Estoy intentando subir una imagen de Android directamente al almacenamiento en la nube de Google. Pero la API no parece funcionar. Tienen algunos ejemplos de Java que están vinculados al motor de la aplicación. No veo ninguna muestra que se haya comprobado que funcione en Android.

En Android, intenté usar la API de json para cargar una imagen. Puedo cargar un objeto de imagen pero parece estar dañado. Por otra parte, generar el token de autenticación también parece ser complicado.

Estoy impresionado con esto ahora mismo. ¿Alguna vez alguien en este mundo ha intentado cargar una imagen / video desde Android utilizando el cliente Java o la API de Json y lo ha logrado? ¿Puede alguien apuntarme 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 probando desde Android al intentar utilizar la API JSON de 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); } L.d("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; }

Estoy teniendo dos problemas aquí.

  1. El archivo que se subió al servidor está dañado. No es la misma imagen que subí. Es brusco.

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



Corregido 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:

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

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


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 necesita descargar httpclient e incluir en su proyecto.


He intentado todas las respuestas anteriores y ninguna de ellas funcionó para mí directamente de la caja. Esto es lo que he hecho para que funcione (solo mediante la edición de 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://.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; } }

Solo edité algunas líneas para que funcionara para mí y para las dependencias en Gradle. Necesitará solo estas tres. (Tenga en cuenta que si utiliza todos los depenacnes de Google que pueden dañar todo su proyecto. En mi caso, algunas de las funciones de Android ya no funcionarán)

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''


La respuesta de Hpsaturn funcionó para mí. Se perdió la oportunidad de responder algunos puntos. Cómo obtener el ID de cuenta de servicio y el archivo p12. Para obtener estos 2, abra console.developers.google.com y elija su proyecto. Habilitar la API de almacenamiento en la nube. Verás un mensaje para crear credenciales. Vaya a las credenciales en el administrador de API y cree las credenciales seleccionando Clave de cuenta de servicio y siga los detalles en la imagen. Obtendrá el ID de cuenta de servicio y el archivo p12 desde esta pantalla.

Hpsaturn también dejó de mencionar AppData, que es su clase de aplicación personalizada definida en manifiesto. Para la comodidad de todos, 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<String> scopes = new ArrayList<String>(); scopes.add(StorageScopes.DEVSTORAGE_FULL_CONTROL); Credential credential = new GoogleCredential.Builder() .setTransport(httpTransport) .setJsonFactory(jsonFactory) .setServiceAccountId("[email protected]") //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 siguiendo la dependencia en el gradle.

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