如何获取谷歌驱动器的文件的URL在Android下载
我可以从谷歌驱动器获取文件的驱动器ID。 通过以下代码。如何获取谷歌驱动器的文件的URL在Android下载
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使用此LINK
下面的代码将获得url供您下载。
String downloadUrl = file.getWebContentLink();
用一个简单的谷歌搜索发现:https://developers.google.com/drive/web/manage-downloads#downloading_files_in_a_browser
全码:
@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);
}
我这个错误:java.lang.RuntimeException:失败的结果ResultInfo {who = null,request = 102,result = -1,data = Intent {act = android.intent.action.PICK(has extras)}} to activity {com .example.googledrivetest2/com.example.googledrivetest2.DownloadActivity}:java.lang.IllegalStateException:伺机不得在UI线程调用@Bidhan一个 – kkkk
哎呀。我忘了。 await()方法将阻塞线程直到获得结果。它不应该在UI线程中调用。您应该将此方法放在回调方法或某个后台线程中。你知道怎么做吗? –
我不明白,因为我是新的。 – kkkk
您正在使用错误的库。
您目前正在使用Google Drive Android API。这仅允许访问存储在设备上的云端硬盘应用程序中的文件。它不允许您访问云中的云端硬盘文件。这就是为什么你看到classCastExceptions。
首先删除所有导入语句,并将它们替换为Google Drive Java库中的等价物。作为一个简单的线索,任何含有.gms的导入都是不正确的。
如果主要目的是下载文件,可以在android-sdk中使用示例。 您将需要driveID,但如果你有这个,可以使用该示例。您将在这里找到它: ./android-sdk/extras/google/google_play_services/drive/demo 查找该文件名为:RetreiveContentsWithProgressDialog.java
的文件显示你如何写一个进度下载。
您是否尝试过使用file.getDownloadUrl()? “ –
”getDownloadUrl()“没有这样的方法@ BidhanA – kkkk
你能给我一个你得到的driveId的例子吗?打印driveId.getResourceId()时会得到什么? –