如何在android中获取要下载的google drive文件的url
我可以从谷歌硬盘获取文件的硬盘id。 通过下面的代码如何在android中获取要下载的google drive文件的url,android,google-drive-api,google-drive-android-api,Android,Google Drive Api,Google Drive Android Api,我可以从谷歌硬盘获取文件的硬盘id。 通过下面的代码 import com.example.googledrivetest2.ProcessDownload.DownloadFileAsync; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesUtil; import com.google.android.gms.common
import com.example.googledrivetest2.ProcessDownload.DownloadFileAsync;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.PendingResult;
import com.google.android.gms.common.api.Result;
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.DriveApi.DriveContentsResult;
import com.google.android.gms.drive.DriveApi.DriveIdResult;
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.DriveFileResult;
import com.google.android.gms.drive.DriveId;
import com.google.android.gms.drive.DriveResource;
import com.google.android.gms.drive.Metadata;
import com.google.android.gms.drive.MetadataChangeSet;
import com.google.android.gms.drive.OpenFileActivityBuilder;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.i(TAG, "in onActivityResult() - triggered on pressing Select");
switch (requestCode) {
case REQUEST_CODE_SELECT:
if (resultCode == RESULT_OK) {
/*get the selected item's ID*/
DriveId driveId = (DriveId) data.getParcelableExtra(
OpenFileActivityBuilder.EXTRA_RESPONSE_DRIVE_ID);//this extra contains the drive id of the selected file
Log.i(TAG, "Selected folder's ID: " + driveId.encodeToString());
Log.i(TAG, "Selected folder's Resource ID: " + driveId.getResourceId());// this is the id of the actual file
Toast.makeText(getApplicationContext()," my id: "+driveId.getResourceId() , Toast.LENGTH_LONG).show();
DriveFile file = Drive.DriveApi.getFile(googleApiClient,driveId);
....
}
};
现在,我想获取该文件的URL,以便我可以使用此文件传递要下载的URL。下面的代码将为您获取URL
String downloadUrl=file.getWebContentLink()代码>
通过简单的谷歌搜索找到它:
完整代码:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.i(TAG, "in onActivityResult() - triggered on pressing Select");
switch (requestCode) {
case REQUEST_CODE_SELECT:
if (resultCode == RESULT_OK) {
/*get the selected item's ID*/
DriveId driveId = (DriveId) data.getParcelableExtra(
OpenFileActivityBuilder.EXTRA_RESPONSE_DRIVE_ID);//this extra contains the drive id of the selected file
Log.i(TAG, "Selected folder's ID: " + driveId.encodeToString());
Log.i(TAG, "Selected folder's Resource ID: " + driveId.getResourceId());// this is the id of the actual file
Toast.makeText(getApplicationContext(), " my id: " + driveId.getResourceId(), Toast.LENGTH_LONG).show();
DriveFile file = Drive.DriveApi.getFile(googleApiClient, driveId);
//get download url
String downloadUrl = file.getWebContentLink();
//do something with the url, for example:
System.out.println("Download URL: " + downloadUrl);
//more info here: https://developers.google.com/drive/web/manage-downloads#downloading_files_in_a_browser
}
}
}
例如:
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.model.File;
import java.io.IOException;
import java.io.InputStream;
// ...
public class MyClass {
// ...
/**
* Download a file's content.
*
* @param service Drive API service instance.
* @param file Drive File instance.
* @return InputStream containing the file's content if successful,
* {@code null} otherwise.
*/
private static InputStream downloadFile(Drive service, File file) {
if (file.getDownloadUrl() != null && file.getDownloadUrl().length() > 0) {
try {
// uses alt=media query parameter to request content
return service.files().get(file.getId()).executeMediaAsInputStream();
} catch (IOException e) {
// An error occurred.
e.printStackTrace();
return null;
}
} else {
// The file doesn't have any content stored on Drive.
return null;
}
}
// ...
}
你试过这个方法了吗
DriveFile file = Drive.DriveApi.getFile(googleApiClient,driveId);
MetadataResult mdRslt = file.getMetadata(googleApiClient).await();
if (mdRslt != null && mdRslt.getStatus().isSuccess()) {
String link = mdRslt.getMetadata().getWebContentLink();
Log.d("LINK", link);
}
你用错图书馆了
您当前正在使用Google Drive Android API。这仅允许访问设备上驱动器应用程序中存储的文件。它不允许您访问云中的驱动器文件。这就是为什么您会看到ClassCastException
首先删除所有导入语句,并将其替换为Google Drive Java库中的等效语句。作为一个简单的线索,任何使用.gms的导入都是不正确的。如果主要目的是下载文件,您可以在android sdk中使用一个示例。
您将需要driveID,但如果您得到了,则可以使用该示例。你可以在这里找到它:
/android sdk/extras/google/google_play_服务/drive/demo
查找名为:RetreiveContentsWithProgressDialog.java的文件
该文件向您展示了如何使用progressbar编写下载。您是否尝试过使用file.getDownloadUrl()?“getDownloadUrl()”没有这样的方法。@bidhana您能给我一个您获得的driveId的示例吗?打印driveId.getResourceId()时会得到什么?当我打印driveId.getResourceId()时,我会得到这个->0Bw6vr2LNxB3iUFJrTk5oZDljaTAIt告诉强制转换到“文件”。我应该投吗@SuperThomasLab@kkkk什么线路?我真的不知道,我只是从谷歌那里得到了这些信息。只要尝试一下,如果它能工作的话……java.lang.RuntimeException:将结果ResultInfo{who=null,request=102,result=-1,data=Intent{act=android.Intent.action.PICK(has extras)}}传递到活动{com.example.googledrivetest2/com.example.googledrivetest2.DownloadActivity}:java.lang.ClassCastException:com.google.android.gms.drive.internal.zzu不能强制转换为com.google.android.gms.drive.Metadata 05-24 16:32:14.669:E/AndroidRuntime(5885):在android.app.ActivityThread.deliverResults(ActivityThread.java:3525)这是强制转换例外。你复制了我给你的完整代码了吗?我复制了esp这些行的DriveFile file=Drive.DriveApi.getFile(googleApiClient,driveId);String downloadUrl=file.getWebContentLink();System.out.println(“下载URL:+下载URL”);我得到了这个错误:java.lang.RuntimeException:未能将结果ResultInfo{who=null,request=102,result=-1,data=Intent{act=android.Intent.action.PICK(has extras)}}传递到活动{com.example.googledrivetest2/com.example.googledrivetest2.DownloadActivity}:java.lang.IllegalStateException:await不能在UI线程@Bidhan AOops上调用。我忘了。wait()方法将阻塞线程,直到它得到结果。不应在UI线程中调用它。您应该将此方法放在回调方法或某个后台线程中。你知道怎么做吗?我不懂,因为我是新来的。你能告诉我怎么做吗@比丹A