- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
在过去的六个小时里,我一直在翻阅来自 Google 的文档,但我仍然不知道如何开始。我想要做的就是让我现有的 Android 应用程序可以从 Google Drive 读取文件,将新文件上传到 Google Drive,以及编辑 Google Drive 上的现有文件。
我读过 Drive SDK v2 只专注于让 Android(以及一般的移动设备)开发人员更容易使用它,但他们的文档中似乎几乎没有任何关于它的内容。
理想情况下,我希望有人指出一些有关如何执行此操作的体面文档、示例或教程(请记住,我使用的是 Android。他们有很多关于如何将 Drive 与 Google App Engine 配合使用的内容;我已经看过了,我不知道如何从它转到 Android 应用程序。)
我需要知道我需要下载哪些库并将其添加到我的项目中,我需要添加到我的 list 中,以及我最终如何从 Google Drive 获取文件列表,下载一个,然后上传修改后的版本。
理想情况下,我希望它能像正式的 Google Drive 应用程序那样自动处理帐户。
最佳答案
编辑:克劳迪奥·凯鲁比诺 (Claudio Cherubino) 说 Google Play 服务现已可用,这将使此过程变得更加容易。但是,没有可用的示例代码(但是,他说它即将推出......他们说 Google Play 服务在 4 个月前“即将推出”,所以这个答案很有可能将继续成为唯一完全有效的访问示例谷歌驱动器从你的 Android 应用程序到 2013 年。)
编辑 2X:当我说谷歌要到明年才会有工作示例时,我似乎已经离开了大约一个月。 Google 的官方指南在这里:
https://developers.google.com/drive/quickstart-android
我还没有测试过他们的方法,所以我 2012 年 9 月(以下)的解决方案可能仍然是最好的:
为此不需要 Google Play 服务。这很痛苦,我花了 50 多个小时(编辑:100 多个小时)才搞清楚这一切,但了解以下很多事情会有所帮助:
图书馆
对于 Google 的一般在线服务,您的项目中需要这些库:( Instructions and Download Link )
AccountManager am = AccountManager.get(activity);
am.getAuthToken(am.getAccounts())[0],
"oauth2:" + DriveScopes.DRIVE,
new Bundle(),
true,
new OnTokenAcquired(),
null);
private class OnTokenAcquired implements AccountManagerCallback<Bundle> {
@Override
public void run(AccountManagerFuture<Bundle> result) {
try {
final String token = result.getResult().getString(AccountManager.KEY_AUTHTOKEN);
HttpTransport httpTransport = new NetHttpTransport();
JacksonFactory jsonFactory = new JacksonFactory();
Drive.Builder b = new Drive.Builder(httpTransport, jsonFactory, null);
b.setJsonHttpRequestInitializer(new JsonHttpRequestInitializer() {
@Override
public void initialize(JSonHttpRequest request) throws IOException {
DriveRequest driveRequest = (DriveRequest) request;
driveRequest.setPrettyPrint(true);
driveRequest.setKey(CLIENT ID YOU GOT WHEN SETTING UP THE CONSOLE BEFORE YOU STARTED CODING)
driveRequest.setOauthToken(token);
}
});
final Drive drive = b.build();
final com.google.api.services.drive.model.File body = new com.google.api.services.drive.model.File();
body.setTitle("My Test File");
body.setDescription("A Test File");
body.setMimeType("text/plain");
final FileContent mediaContent = new FileContent("text/plain", an ordinary java.io.File you'd like to upload. Make it using a FileWriter or something, that's really outside the scope of this answer.)
new Thread(new Runnable() {
public void run() {
try {
com.google.api.services.drive.model.File file = drive.files().insert(body, mediaContent).execute();
alreadyTriedAgain = false; // Global boolean to make sure you don't repeatedly try too many times when the server is down or your code is faulty... they'll block requests until the next day if you make 10 bad requests, I found.
} catch (IOException e) {
if (!alreadyTriedAgain) {
alreadyTriedAgain = true;
AccountManager am = AccountManager.get(activity);
am.invalidateAuthToken(am.getAccounts()[0].type, null); // Requires the permissions MANAGE_ACCOUNTS & USE_CREDENTIALS in the Manifest
am.getAuthToken (same as before...)
} else {
// Give up. Crash or log an error or whatever you want.
}
}
}
}).start();
Intent launch = (Intent)result.getResult().get(AccountManager.KEY_INTENT);
if (launch != null) {
startActivityForResult(launch, 3025);
return; // Not sure why... I wrote it here for some reason. Might not actually be necessary.
}
} catch (OperationCanceledException e) {
// Handle it...
} catch (AuthenticatorException e) {
// Handle it...
} catch (IOException e) {
// Handle it...
}
}
}
private java.io.File downloadGFileToJFolder(Drive drive, String token, File gFile, java.io.File jFolder) throws IOException {
if (gFile.getDownloadUrl() != null && gFile.getDownloadUrl().length() > 0 ) {
if (jFolder == null) {
jFolder = Environment.getExternalStorageDirectory();
jFolder.mkdirs();
}
try {
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(gFile.getDownloadUrl());
get.setHeader("Authorization", "Bearer " + token);
HttpResponse response = client.execute(get);
InputStream inputStream = response.getEntity().getContent();
jFolder.mkdirs();
java.io.File jFile = new java.io.File(jFolder.getAbsolutePath() + "/" + getGFileName(gFile)); // getGFileName() is my own method... it just grabs originalFilename if it exists or title if it doesn't.
FileOutputStream fileStream = new FileOutputStream(jFile);
byte buffer[] = new byte[1024];
int length;
while ((length=inputStream.read(buffer))>0) {
fileStream.write(buffer, 0, length);
}
fileStream.close();
inputStream.close();
return jFile;
} catch (IOException e) {
// Handle IOExceptions here...
return null;
}
} else {
// Handle the case where the file on Google Drive has no length here.
return null;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 3025) {
switch (resultCode) {
case RESULT_OK:
AccountManager am = AccountManager.get(activity);
am.getAuthToken(Same as the other two times... it should work this time though, because now the user is actually logged in.)
break;
case RESULT_CANCELED:
// This probably means the user refused to log in. Explain to them why they need to log in.
break;
default:
// This isn't expected... maybe just log whatever code was returned.
break;
}
} else {
// Your application has other intents that it fires off besides the one for Drive's log in if it ever reaches this spot. Handle it here however you'd like.
}
}
public void updateGFileFromJFile(Drive drive, File gFile, java.io.File jFile) throws IOException {
FileContent gContent = new FileContent("text/csv", jFile);
gFile.setModifiedDate(new DateTime(false, jFile.lastModified(), 0));
gFile = drive.files().update(gFile.getId(), gFile, gContent).setSetModifiedDate(true).execute();
}
关于Android 在 Google Drive SDK 中打开和保存文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12164024/
我正在尝试使用 Drive SDK 将文件上传到 Google Drive . 我想知道是否有 API 方法来检查用户的驱动器是否有足够的容量来保存文件。如果是,请指出我应该搜索的位置,如果不是,最好
我想在我正在开发的新 android 应用程序(又名 drive.appdata 范围)中使用特殊应用程序数据文件夹中的文件。 谷歌的你们在与 Google Play Services 4.2 捆绑的
列出Google云端硬盘文件的JavaScript示例使用gapi.client.drive.files.list()。 尝试使用此方法时,出现错误“无法读取未定义的属性'files'”。 该问题和解
我正在尝试使用 Google Cloud REST API 获取特定文件夹大小。 我已经尝试过使用 REST API 的“ about ”方法,但在这种方法中,我获得了整个云存储的已用字节总数和可用空
我只是想了解在 G Suite 上使用 Team Drive 获取团队存储库与仅使用 Google Drive 上的共享文件夹相比的优势。通过搜索不同的来源并进行测试,到目前为止我发现了以下结果。 坦
我正在尝试使用 Google Drive API (v3) 更新文档 在 Google 云端硬盘中。 我已阅读此迁移指南: Google Drive API v3 Migration 并对其进行编码以
我曾尝试将我的 Web 应用程序集成到 Google 云端硬盘用户界面(以打开文件),但没有取得多大成功。我无法使用 OAuth 范围 https://www.googleapis.com/auth/
使用Google Drive API时 我使用 com.google.api.services.drive.Drive.files() 来迭代一些文件。 我注意到所有目录对象都没有权限? 当我使用 F
Google Drive API 和 Google Spreadsheet API (v 3.0) 都支持获取与以下 URL 对应的 [KEY] 的方法: https://docs.google.co
我正在尝试将本地 CSV 文件上传到 Google Drive 并在那里像 Google 电子表格一样显示它。但是,当我转到 Google Drive 并单击指向我的文件的链接时,我只能下载它,而不能
我正在尝试使用 ArrayBuffer 的内容在 Google Drive 上创建一个文件。我正在使用 Javascript 和 Drive API 的第 3 版。 我设法使用 this code s
我可以使用 google drive android api 将文本文件上传到 google drive 中的文件夹。 Sample code 但是我想上传一张图片到谷歌驱动器。这可能吗? 创建文本文
我想知道以下是否可行,因为我似乎无法在网上找到任何具体的方法: 当 Google Takeaway 服务将新的 takeout-xxx.zip 文件上传到我的 Google Drive Takeawa
是否可以对 Google Drive 上的文件执行“追加”操作? 假设我想使用 Google Drive 保存日志条目“as-they-come-in”,是否有某种“仅附加”操作可用? 最佳答案 如果
看着 Google Drive scopes .我明白: https://www.googleapis.com/auth/drive.install - 用于让用户批准安装应用程序的特殊范围 如果我希
我有一个带有两个父文件夹( FILE-1 和 FOLDER-1 )的文档( FOLDER-2 )。 如果我删除 FOLDER-1 , FILE-1也被删除。然而,我预计只有FOLDER-1将被删除,并
我正在测试Google Drive API。测试脚本执行HTTP GET来访问Files-> List API,但是我总是以某种方式在项目中得到一个空列表。我的Google驱动器中有数百个文件,因此结
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 8年前关闭。 Improve this q
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 8年前关闭。 Improve this q
我将我的应用程序的文件托管在 Google Drive 上,它会在首次启动后立即下载它们。一切都很好,但在我发布新的应用程序版本后,下载数量不断增加,文件由于某些原因变得不可用。虽然我没有改变任何东西
我是一名优秀的程序员,十分优秀!