我想从我的应用程序上传一个db文件到谷歌驱动器.我能够在谷歌驱动器中创建一个文件夹,但我没有得到如何上传数据库文件.
这是我的代码.
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,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; } }
解决方法
首先,我看到这些进口的事实:
import com.google.api.client.http.FileContent; ... import com.google.api.services.drive.Drive;
表示您正在混合GDAA和REST Api.除非你想进入trouble,否则不要这样做.
因此,当你得到FolderId时,它是你的’DB’文件的父类,我推测(如果DB文件是sqlite类型,你的MIME TYPE应该是’application / x-sqlite3′).
无论如何,在GDAA中,首先必须将java.io.File(代表’DB’)转换为内容.而且你必须提供元数据(如文件标题,mime类型,标志……).你得到了正确的元数据,这是你绊倒的内容.以下片段应该做你需要的(不要让我负责,我在5分钟内将它抨击 – 没有测试)
/****************************************************************** * 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,buf.length)) > 0) { oos.write(buf,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(); } }
我注意到,你正在为你的项目调整’官方’GDAA DEMO.如果它不够或压倒性,你也可以看看这个demo,它采用不同的方法来解决同样的问题.
祝好运
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。