如何在android中获取要下载的google drive文件的url

如何在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

我可以从谷歌硬盘获取文件的硬盘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.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