¿Cómo subir un archivo db a Google Drive desde la aplicación Android?
Quiero subir un archivo DB de mi aplicación a Google Drive. Puedo crear una carpeta en la impulsión de google pero no estoy consiguiendo cómo cargar el archivo del db.
Este es mi código.
- Obtener nombre de usuario, avatar de google account
- No se reconoce la carpeta de Google Drive al descargarla en la aplicación de Android
- Autorizar mi aplicación para usar una carpeta existente
- Creación de una carpeta dentro de una carpeta en google drive android
- Common_google_play_services_unknown_issue "no se traduce en af, am, ar, be, bg
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.IOException; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.webkit.MimeTypeMap; import android.widget.Button; import android.widget.Toast; import com.google.android.gms.common.api.ResultCallback; import com.google.android.gms.drive.Drive; import com.google.android.gms.drive.DriveApi; import com.google.android.gms.drive.DriveContents; import com.google.android.gms.drive.DriveFile; import com.google.android.gms.drive.DriveFolder; import com.google.android.gms.drive.DriveFolder.DriveFolderResult; import com.google.android.gms.drive.DriveId; import com.google.android.gms.drive.Metadata; import com.google.android.gms.drive.MetadataChangeSet; import com.google.android.gms.drive.DriveApi.DriveContentsResult; import com.google.api.client.http.FileContent; //import com.google.api.services.drive.Drive; import com.google.api.services.drive.Drive.Files; import com.google.api.services.drive.model.File; import com.google.api.services.drive.model.FileList; //import com.google.api.services.drive.Drive; public class MainActivity extends BaseDemoActivity { private final static String TAG = "MainActivity"; DriveId folderId; private static Uri fileUri; @Override public void onConnected(Bundle connectionHint) { super.onConnected(connectionHint); MetadataChangeSet changeSet = new MetadataChangeSet.Builder().setTitle("New folder").build(); Drive.DriveApi.getRootFolder(getGoogleApiClient()) .createFolder(getGoogleApiClient(), changeSet) .setResultCallback(folderCreatedCallback); saveToDrive(); } ResultCallback<DriveFolderResult> folderCreatedCallback = new ResultCallback<DriveFolderResult>() { @Override public void onResult(DriveFolderResult result) { if (!result.getStatus().isSuccess()) { showMessage("Error while trying to create the folder"); return; } folderId = result.getDriveFolder().getDriveId(); showMessage("Created a folder: " + result.getDriveFolder().getDriveId()); } }; final ResultCallback<DriveFolder.DriveFileResult> fileCallBack = new ResultCallback<DriveFolder.DriveFileResult>() { @Override public void onResult(DriveFolder.DriveFileResult driveFileResult) { if (!driveFileResult.getStatus().isSuccess()) { Log.v(TAG, "Error while trying to create the file"); return; } //Initialize mFile to be processed in AsyncTask DriveFile mfile = driveFileResult.getDriveFile(); new EditContentsAsyncTask(MainActivity.this).execute(mfile); } }; public void saveToDrive() { fileUri = Uri.fromFile(new java.io.File(Environment.getDataDirectory().getPath() + "/data/com.example.dbupload/databases/Student")); java.io.File fileContent = new java.io.File(fileUri.getPath()); FileContent mediaContent = new FileContent(getMimeType("db"), fileContent); File body = new com.google.api.services.drive.model.File(); body.setTitle(fileContent.getName()); body.setMimeType(getMimeType("db")); // File file = service.files().insert(body, mediaContent).execute(); } public class EditContentsAsyncTask extends ApiClientAsyncTask<DriveFile, Void, Boolean> { public EditContentsAsyncTask(Context context) { super(context); } @Override protected Boolean doInBackgroundConnected(DriveFile... args) { DriveFile file = args[0]; try { DriveContentsResult driveContentsResult = file.open( getGoogleApiClient(), DriveFile.MODE_WRITE_ONLY, null).await(); if (!driveContentsResult.getStatus().isSuccess()) { return false; } DriveContents driveContents = driveContentsResult.getDriveContents(); //edit the outputStream DatabaseHandler db = new DatabaseHandler(MainActivity.this); String inFileName = getApplicationContext().getDatabasePath(db.getDatabaseName()).getPath(); //DATABASE PATH FileInputStream is = new FileInputStream(inFileName); BufferedInputStream in = new BufferedInputStream(is); byte[] buffer = new byte[8 * 1024]; BufferedOutputStream out = new BufferedOutputStream(driveContents.getOutputStream()); int n = 0; while ((n = in.read(buffer)) > 0) { out.write(buffer, 0, n); } in.close(); com.google.android.gms.common.api.Status status = driveContents.commit(getGoogleApiClient(), null).await(); return status.getStatus().isSuccess(); } catch (IOException e) { Log.e(TAG, "IOException while appending to the output stream", e); } return false; } @Override protected void onPostExecute(Boolean result) { if (!result) { showMessage("Error while editing contents"); return; } showMessage("Successfully edited contents"); } } private String getMimeType(String string) { // TODO Auto-generated method stub return null; } }
Puedo crear una carpeta en impulsión. ¿alguien puede ayudarme por favor qué debo hacer para cargar un archivo db?
- Descargar un archivo de Google Drive por URL En Android
- ¿Para el acceso a API de Google, puedo crear varios ID de cliente para el mismo nombre de paquete de Android?
- ¿GoogleAccountCredential proporciona token de actualización?
- Comprobación de la sincronización de archivos mediante Drive API
- No hay intención de UserRecoverableAuthIOException con Drive SDK para Android
- Unidad de Google para realizar copias de seguridad y restaurar la base de datos y las preferencias compartidas de la aplicación de Android
- Iniciar sesión en Google Drive en Android sin agregar la cuenta de Google al dispositivo
- Uso del SDK de Google Drive de Android
En primer lugar, el hecho de que estoy viendo estas importaciones:
import com.google.api.client.http.FileContent; ... import com.google.api.services.drive.Drive;
indica que estás mezclando GDAA y el REST Api. No lo hagas a menos que quieras meterte en problemas .
Por lo tanto, cuando tienes tu FolderId, es un padre de tu archivo 'DB', supongo (y si el archivo DB es un tipo SQLite, tu tipo MIME debería ser 'application / x-sqlite3').
De todos modos, en GDAA, primero tienes que convertir tu java.io.File (que representa el 'DB') en el contenido . Y usted tiene que proporcionar metadatos (como el título del archivo, el tipo mime, banderas …). Tienes los metadatos bien, es el contenido que tropezó. El fragmento siguiente debe hacer lo que necesites (no me hagas responsable, lo cerré en 5 minutos – sin pruebas)
/****************************************************************** * create file in GOODrive * @param pFldr parent's ID * @param titl file name * @param mime file mime type (application/x-sqlite3) * @param file file (with content) to create */ static void saveToDrive(final DriveFolder pFldr, final String titl, final String mime, final java.io.File file) { if (getGoogleApiClient() != null && pFldr != null && titl != null && mime != null && file != null) try { // create content from file Drive.DriveApi.newDriveContents(getGoogleApiClient()).setResultCallback(new ResultCallback<DriveContentsResult>() { @Override public void onResult(DriveContentsResult driveContentsResult) { DriveContents cont = driveContentsResult != null && driveContentsResult.getStatus().isSuccess() ? driveContentsResult.getDriveContents() : null; // write file to content, chunk by chunk if (cont != null) try { OutputStream oos = cont.getOutputStream(); if (oos != null) try { InputStream is = new FileInputStream(file); byte[] buf = new byte[4096]; int c; while ((c = is.read(buf, 0, buf.length)) > 0) { oos.write(buf, 0, c); oos.flush(); } } finally { oos.close();} // content's COOL, create metadata MetadataChangeSet meta = new Builder().setTitle(titl).setMimeType(mime).build(); // now create file on GooDrive pFldr.createFile(getGoogleApiClient(), meta, cont).setResultCallback(new ResultCallback<DriveFileResult>() { @Override public void onResult(DriveFileResult driveFileResult) { if (driveFileResult != null && driveFileResult.getStatus().isSuccess()) { // BINGO } else { // report error } } }); } catch (Exception e) { e.printStackTrace(); } } }); } catch (Exception e) { e.printStackTrace(); } }
Me di cuenta, estás adaptando el DEMO "oficial" de GDAA para tu proyecto. En caso de que no sea suficiente o abrumador, también puede mirar a esta demo , que tiene un enfoque diferente para el mismo problema.
Buena suerte
Compruebe su tipo mime de archivo de base de datos.
private String getMimeType(String string) { //set return "application/x-sqlite3"; return "application/x-sqlite3"; }