有人可以为 Google Drive REST API v3 提供最新的 Android 指南吗?

Posted

技术标签:

【中文标题】有人可以为 Google Drive REST API v3 提供最新的 Android 指南吗?【英文标题】:Can someone provide an up-to-date Android guide for Google Drive REST API v3? 【发布时间】:2019-11-18 20:25:55 【问题描述】:

我自己和许多其他人一直在努力设置 Google Drive REST API v3 以使用 android 应用程序。这主要是因为 Google 官方文档缺少适用于 Android 的快速入门指南,我们只能找到散布在各处的(过时和/或令人困惑的)信息碎片 - 但需要的是 完整 针对初学者的最新指南,帮助他们启动和运行我们,以便他们可以打开和编辑其云端硬盘上的文件,包括如何设置凭据、依赖项和清单。

所以我问是否有人愿意创建这样的指南,或者可以指出已经制作的这样的指南 a) 与最新版本的 Google Drive API REST v3 相关,详细 here 和b) 涵盖了初学者需要入门的所有上述方面?

ArtOfWarfare here 发布的指南绝对是完美,正是我正在寻找的——但不幸的是,这些指南已经过时了好几年。谁能提供本指南的最新版本?非常感谢。

【问题讨论】:

如果你得到了答案或者你做到了,你能分享一些代码吗? @RoshanS 很抱歉,但遗憾的是我从未弄清楚这一点,因此放弃了 Android 编程。我想到了一个数据库应用程序,它可以在 WPF PC 应用程序和使用 Google Drive 的 Android 应用程序之间同步 XML 数据,但我想这永远不会发生 :-( 我也在赏金上浪费了代表点,但我想没有有人可能会费心为非专业人士制定适当的指南。祝你好运...... 兄弟,我想我在这方面取得了一些进展。你可以在下面检查它。它为我工作。我可以使用此代码创建文件夹、文件、上传文件、列出文件、删除文件/文件夹和下载文件。看看它是否仍然对你有用。 ***.com/a/59063198/9538854 嗨@RoshanS 感谢您发布您的发现,我会再试一次。使用 OAuth 同意范围,它显示了很多 Google Drive 范围,您在指南中指的是哪两个范围? 嗨 ChrisUK,关于您的第一个问题,您只需检查未锁定的范围(appdata 和文件)。别管那些被锁的。你不需要它们。关于你的第二个问题,你现在不需要提交谷歌验证。但是您必须在发布您的应用程序之前这样做,否则使用驱动器会有一些限制。有关更多信息,请参阅 (support.google.com/cloud/answer/6158849?hl=en) 的“用户同意”部分。 【参考方案1】:

在回答这个问题之前,我想让您知道我从这里 (https://ammar.lanui.online/integrate-google-drive-rest-api-on-android-app-bc4ddbd90820) 获得了代码,而来自 Google 的文档对我没有多大帮助。所以这个解决方案来自我可用的有限资源。

我需要驱动器才能从我的应用上传和下载文件。在驱动器中,我必须创建一个文件夹,并且必须将文件从我的应用程序上传到该文件夹​​,然后将文件从该文件夹下载到我的设备。这段代码对我来说很好用。

我相信您一定已经完成了 Google 登录。如果没有,请观看此视频 (https://youtu.be/t-yZUqthDMM)。

要与 Drive API 交互,您需要为您的应用启用 Drive API 服务。您可以在 Google Developer Console 中执行此操作。

要启用 Drive API,请完成以下步骤:

转到 Google API 控制台。

    选择一个项目。

    在左侧边栏中,展开 APIs & auth 并选择 APIs。

    在显示的可用 API 列表中,单击 Drive API 链接,然后单击启用 API。

如果您已完成,则进入控制台中的 OAuth 同意屏幕并添加驱动器的两个范围并保存。

在您的项目中添加以下依赖项。

implementation 'com.google.android.gms:play-services-auth:17.0.0'// for google sign in

// for drive integration
implementation 'com.google.android.gms:play-services-auth:16.0.1'
implementation 'com.google.http-client:google-http-client-gson:1.26.0'
implementation('com.google.api-client:google-api-client-android:1.26.0') 
exclude group: 'org.apache.httpcomponents'

implementation('com.google.apis:google-api-services-drive:v3-rev136-1.25.0') 

exclude group: 'org.apache.httpcomponents'
 

在 android 标签内,在同一个 gradle 文件中,添加打包选项。

packagingOptions 
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/license.txt'
exclude 'META-INF/NOTICE'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/notice.txt'
exclude 'META-INF/ASL2.0'

在您的清单文件中,添加所需的权限

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

在这里,我将下载的文件存储在外部存储中。所以这就是我添加外部存储读写权限的原因

在 Google 登录后,请求访问 Google 云端硬盘的权限。它的代码如下。

private void checkForGooglePermissions() 

    if (!GoogleSignIn.hasPermissions(
            GoogleSignIn.getLastSignedInAccount(getApplicationContext()),
            ACCESS_DRIVE_SCOPE,
            SCOPE_EMAIL)) 
        GoogleSignIn.requestPermissions(
                MainActivity.this,
                RC_AUTHORIZE_DRIVE,
                GoogleSignIn.getLastSignedInAccount(getApplicationContext()),
                ACCESS_DRIVE_SCOPE,
                SCOPE_EMAIL);
     else 
        Toast.makeText(this, "Permission to access Drive and Email has been granted", Toast.LENGTH_SHORT).show();
        driveSetUp();

    


变量 ACCESS_DRIVE_SCOPE 和 SCOPE_EMAIL 是,

Scope ACCESS_DRIVE_SCOPE = new Scope(Scopes.DRIVE_FILE);
Scope SCOPE_EMAIL = new Scope(Scopes.EMAIL);

获得许可并登录后,我们就有了 GoogleSignInAccount 对象。使用这个对象,创建一个 GoogleAccountCredential 对象,我们可以从中生成一个 Drive 对象。 Drive 对象是我们在 Google Drive 之间进行通信所需要的。

private void driveSetUp() 

GoogleSignInAccount mAccount = GoogleSignIn.getLastSignedInAccount(MainActivity.this);

GoogleAccountCredential credential =
        GoogleAccountCredential.usingOAuth2(
                getApplicationContext(), Collections.singleton(Scopes.DRIVE_FILE));
credential.setSelectedAccount(mAccount.getAccount());
googleDriveService =
        new com.google.api.services.drive.Drive.Builder(
                AndroidHttp.newCompatibleTransport(),
                new GsonFactory(),
                credential)
                .setApplicationName("GoogleDriveIntegration 3")
                .build();
mDriveServiceHelper = new DriveServiceHelper(googleDriveService);

在这里你可以看到我创建了一个 DriveServiceHelper 类的对象,并传递了 Drive(googleDriveSrvice) 的对象。 DriveServiceHelper 类如下所示。我从这里得到的。(https://github.com/gsuitedevs/android-samples/blob/master/drive/deprecation/app/src/main/java/com/google/android/gms/drive/sample/driveapimigration/DriveServiceHelper.java?source=post_page-----bc4ddbd90820----------------------)。你可以用那个。我在该课程中为自己做了一些改变。

public class DriveServiceHelper 

private final Executor mExecutor = Executors.newSingleThreadExecutor();
private final Drive mDriveService;
private final String TAG = "DRIVE_TAG";


public DriveServiceHelper(Drive driveService) 

    mDriveService = driveService;


/**
 * Creates a text file in the user's My Drive folder and returns its file ID.
 */
public Task<GoogleDriveFileHolder> createFile(String folderId, String filename) 
    return Tasks.call(mExecutor, () -> 
        GoogleDriveFileHolder googleDriveFileHolder = new GoogleDriveFileHolder();

        List<String> root;
        if (folderId == null) 

            root = Collections.singletonList("root");

         else 

            root = Collections.singletonList(folderId);
        
        File metadata = new File()
                .setParents(root)
                .setMimeType("text/plain")
                .setName(filename);

        File googleFile = mDriveService.files().create(metadata).execute();
        if (googleFile == null) 

            throw new IOException("Null result when requesting file creation.");
        
        googleDriveFileHolder.setId(googleFile.getId());
        return googleDriveFileHolder;
    );



// TO CREATE A FOLDER

public Task<GoogleDriveFileHolder> createFolder(String folderName, @Nullable String folderId) 
    return Tasks.call(mExecutor, () -> 

        GoogleDriveFileHolder googleDriveFileHolder = new GoogleDriveFileHolder();

        List<String> root;
        if (folderId == null) 

            root = Collections.singletonList("root");

         else 

            root = Collections.singletonList(folderId);
        
        File metadata = new File()
                .setParents(root)
                .setMimeType("application/vnd.google-apps.folder")
                .setName(folderName);

        File googleFile = mDriveService.files().create(metadata).execute();
        if (googleFile == null) 
            throw new IOException("Null result when requesting file creation.");
        
        googleDriveFileHolder.setId(googleFile.getId());
        return googleDriveFileHolder;
    );



public Task<Void> downloadFile(java.io.File targetFile, String fileId) 
    return Tasks.call(mExecutor, () -> 

        // Retrieve the metadata as a File object.
        OutputStream outputStream = new FileOutputStream(targetFile);
        mDriveService.files().get(fileId).executeMediaAndDownloadTo(outputStream);
        return null;
    );


public Task<Void> deleteFolderFile(String fileId) 

    return Tasks.call(mExecutor, () -> 

        // Retrieve the metadata as a File object.
        if (fileId != null) 
            mDriveService.files().delete(fileId).execute();
        

        return null;

    );


// TO LIST FILES

public List<File> listDriveImageFiles() throws IOException

    FileList result;
    String pageToken = null;
    do 
        result = mDriveService.files().list()
/*.setQ("mimeType='image/png' or mimeType='text/plain'")This si to list both image and text files. Mind the type of image(png or jpeg).setQ("mimeType='image/png' or mimeType='text/plain'") */
                .setSpaces("drive")
                .setFields("nextPageToken, files(id, name)")
                .setPageToken(pageToken)
                .execute();

        pageToken = result.getNextPageToken();
     while (pageToken != null);

    return result.getFiles();


// TO UPLOAD A FILE ONTO DRIVE

public Task<GoogleDriveFileHolder> uploadFile(final java.io.File localFile, 
final String mimeType, @Nullable final String folderId) 
    return Tasks.call(mExecutor, new Callable<GoogleDriveFileHolder>() 
        @Override
        public GoogleDriveFileHolder call() throws Exception 
            // Retrieve the metadata as a File object.

            List<String> root;
            if (folderId == null) 
                root = Collections.singletonList("root");
             else 

                root = Collections.singletonList(folderId);
            

            File metadata = new File()
                    .setParents(root)
                    .setMimeType(mimeType)
                    .setName(localFile.getName());

            FileContent fileContent = new FileContent(mimeType, localFile);

            File fileMeta = mDriveService.files().create(metadata, 
fileContent).execute();
            GoogleDriveFileHolder googleDriveFileHolder = new 
GoogleDriveFileHolder();
            googleDriveFileHolder.setId(fileMeta.getId());
            googleDriveFileHolder.setName(fileMeta.getName());
            return googleDriveFileHolder;
        
    );


请记住,每当您创建文件或文件夹或上传文件时,驱动器都会为其提供一个唯一 ID,您可以访问它。所以这里不是唯一的文件名,而是文件的 id。因此,如果您多次上传或创建同名文件,它将多次保存在文件夹中。所以如果你想用另一个同名文件替换一个文件。首先删除文件并保存/上传。 要创建文件,请指定要创建的文件夹 ID 和文件名。

GoogleDriveHolder 类如下所示。

public class GoogleDriveFileHolder 

private String id;
private String name;
private DateTime modifiedTime;
private long size;
private DateTime createdTime;
private Boolean starred;


public DateTime getCreatedTime() 
    return createdTime;


public void setCreatedTime(DateTime createdTime) 
    this.createdTime = createdTime;


public Boolean getStarred() 
    return starred;


public void setStarred(Boolean starred) 
    this.starred = starred;


public String getId() 
    return id;


public void setId(String id) 
    this.id = id;


public String getName() 
    return name;


public void setName(String name) 
    this.name = name;


public DateTime getModifiedTime() 
    return modifiedTime;


public void setModifiedTime(DateTime modifiedTime) 
    this.modifiedTime = modifiedTime;


public long getSize() 
    return size;


public void setSize(long size) 
    this.size = size;


您必须从您的活动中调用这些方法。就像下面给出的代码一样。

创建文件夹

public void createFolderInDrive(View view) 

Log.i(TAG, "Creating a Folder...");
mDriveServiceHelper.createFolder("My Foder", null)
        .addOnSuccessListener(new OnSuccessListener<GoogleDriveFileHolder>() 
            @Override
            public void onSuccess(GoogleDriveFileHolder googleDriveFileHolder) 

                Gson gson = new Gson();
                Log.i(TAG, "onSuccess of Folder creation: " + gson.toJson(googleDriveFileHolder));
            
        )
        .addOnFailureListener(new OnFailureListener() 
            @Override
            public void onFailure(@NonNull Exception e) 

                Log.i(TAG, "onFailure of Folder creation: " + e.getMessage());
            
        );

列出文件

public void listFilesInDrive(View view) 

Log.i(TAG, "Listing Files...");
new MyAsyncTask().execute();


要列出文件,你不能在你的主线程中这样做,因为它会导致死锁。您必须在 Asynctask 的 doInBackground() 方法中执行此操作。这是我的课。

public class MyAsyncTask extends AsyncTask<Void, Void, List<File>> 

List<File> fileList;

@Override
protected List<File> doInBackground(Void... voids) 

    try 

        fileList = mDriveServiceHelper.listDriveImageFiles();

     catch (IOException e) 

        Log.i(TAG, "IO Exception while fetching file list");
    

    return fileList;



@Override
protected void onPostExecute(List<File> files) 
    super.onPostExecute(files);

    if (files.size() == 0)

        Log.i(TAG, "No Files");
    
    for (File file : files) 

        Log.i(TAG, "\nFound file: File Name :" +
                file.getName() + " File Id :" + file.getId());
    


上传文件

要将文件上传到 Drive 文件夹,请指定文件夹 id 、要上传的文件的 mime 类型以及文件本身。 在这里,我从图库中选择了一张图片并将其上传到驱动器中。

public void uploadFile(View view) 

if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) 
    ActivityCompat.requestPermissions(MainActivity.this, new String[]Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, REQUEST_PICK_IMAGE);

 else 
    Intent i = new Intent(
            Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

    startActivityForResult(i, RESULT_LOAD_IMAGE);


在 onActivityResult 中

else if (requestCode == RESULT_LOAD_IMAGE) 

if (resultCode == RESULT_OK) 

    Uri selectedImage = data.getData();
    String[] filePathColumn = MediaStore.Images.Media.DATA;

    Cursor cursor = getContentResolver().query(selectedImage,
            filePathColumn, null, null, null);
    cursor.moveToFirst();

    int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
    String picturePath = cursor.getString(columnIndex);
    cursor.close();

    uploadImageIntoDrive(BitmapFactory.decodeFile(picturePath));

 else 

    Toast.makeText(this, "Did not select any image", Toast.LENGTH_SHORT).show();

uploadImageIntoDrive() 方法,

private void uploadImageIntoDrive(Bitmap bitmap) 

try 

    if (bitmap == null) 

        Log.i(TAG, "Bitmap is null");
        return;
    
    java.io.File file = new java.io.File(getApplicationContext().getFilesDir(), "FirstFile");
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 0 /*ignored for PNG*/, bos);
    byte[] bitmapdata = bos.toByteArray();

    //write the bytes in file
    FileOutputStream fos = new FileOutputStream(file);
    fos.write(bitmapdata);
    fos.flush();
    fos.close();

    mDriveServiceHelper.uploadFile(file, "image/jpeg", "MY_FOLDER_ID")
            .addOnSuccessListener(new OnSuccessListener<GoogleDriveFileHolder>() 
                @Override
                public void onSuccess(GoogleDriveFileHolder googleDriveFileHolder) 

                    Log.i(TAG, "Successfully Uploaded. File Id :" + googleDriveFileHolder.getId());
                
            )
            .addOnFailureListener(new OnFailureListener() 
                @Override
                public void onFailure(@NonNull Exception e) 

                    Log.i(TAG, "Failed to Upload. File Id :" + e.getMessage());
                
            );
 catch (Exception e) 

    Log.i(TAG, "Exception : " + e.getMessage());



下载文件

要下载文件,请指定文件的 ID 和下载文件必须存储到的目标文件。

public void downloadFile(View view) 

java.io.File file = new java.io.File(getExternalFilesDir(null), "DemoFile2.jpg");
mDriveServiceHelper.downloadFile(file, "MY_FILE_ID")
        .addOnSuccessListener(new OnSuccessListener<Void>() 
            @Override
            public void onSuccess(Void aVoid) 

                Log.i(TAG, "Downloaded the file");
                long file_size = file.length() / 1024;
                Log.i(TAG, "file Size :" + file_size);
                Log.i(TAG, "file Path :" + file.getAbsolutePath());
            
        )
        .addOnFailureListener(new OnFailureListener() 
            @Override
            public void onFailure(@NonNull Exception e) 

                Log.i(TAG, "Failed to Download the file, Exception :" + e.getMessage());
            
        );

删除文件。

public void deleteFile(View view) 

mDriveServiceHelper.deleteFolderFile("MY_FILE_OR_FOLDER_ID")
        .addOnSuccessListener(new OnSuccessListener<Void>() 
            @Override
            public void onSuccess(Void aVoid) 

                Log.i(TAG, "onSuccess of Deleting File ");
            
        )
        .addOnFailureListener(new OnFailureListener() 
            @Override
            public void onFailure(@NonNull Exception e) 

                Log.i(TAG, "onFailure on Deleting File Exception : " + e.getMessage());
            
        );

我不是一个有经验的人。我发布此代码的原因是有人会发现它很有用,并且可以提出他们自己的更改并将其发布在这里。因为目前对于 Android 的 Drive Rest API 集成没有太多参考。

谢谢。

【讨论】:

此答案应标记为正确。很好的解释,提供了开始使用 Google Drive 的所有必要信息。谷歌的文档太糟糕了!!!! AsyncTask 从版本 30 开始被弃用 @Darksymphony,那么,替代品是什么? @NoorHossain 最简单的替代方法之一是使用线程。 这是一个很好的答案,虽然回答的人像新手,但工作很棒!这意味着 Stack Overflow 可以帮助人们。但还有一个补充:为了列出驱动器中的所有文件,为每个页面设置页面令牌并且不要设置 pageSize。【参考方案2】:

我也需要那个。我设法通过这些链接构建了一些虽然不是最佳的东西:

Google guides for REST API v3

Google Github demo project for migration to REST after deprecation of the other method

Documentation for REST API v3

我现在剩下的主要问题是找到一个文件/文件夹选择器。演示项目中的一个使用SAF does not allow to retrieve the ID of the file you picked (Oo !!!)

【讨论】:

Tasks.call(mExecutor ... 已被弃用【参考方案3】:

我在尝试了解如何使用 Drive REST API 时参考的文章是 on this page

我对 Android 还很陌生,但这里是我获取文件 ID 列表的方法。希望对你有帮助

创建一个返回文件列表的方法(不要将它们与 java.io.Files 混淆)。 它们是com.google.api.services.drive.model.File; 的实例 下面的方法是来自 github 上的弃用教程的 DriveServiceHelper 类的一部分。检查源文件以了解 mExecutor 和 mDriveService 实例是如何创建的

public Task<FileList> queryFiles() 
    return Tasks.call(mExecutor, () ->
            mDriveService.files().list().setSpaces("drive").execute());

然后您可以迭代列表并获取每个文件的 ID

for (File file : fileList.getFiles()) 
   file.getId()

获得 ID 后,您可以删除或更新文件 以下是删除您的应用每次上传到 Google Drive 时创建的重复文件的方法示例:

private void mQuery(String name) 
    if (mDriveServiceHelper != null) 
        Log.d(TAG, "Querying for files.");

        mDriveServiceHelper.queryFiles()
                .addOnSuccessListener(fileList -> 
                    for (File file : fileList.getFiles()) 
                        if(file.getName().equals(name))
                            mDriveServiceHelper.deleteFolderFile(file.getId()).addOnSuccessListener(v-> Log.d(TAG, "removed file "+file.getName())).
                                    addOnFailureListener(v-> Log.d(TAG, "File was not removed: "+file.getName()));
                    
                )
                .addOnFailureListener(exception -> Log.e(TAG, "Unable to query files.", exception));
    

这里是 DriveServiceHelper 类的 deleteFolderFile 方法

public Task<Void> deleteFolderFile(String fileId) 
    return Tasks.call(mExecutor, () -> 
        // Retrieve the metadata as a File object.
        if (fileId != null) 
            mDriveService.files().delete(fileId).execute();
        
        return null;
    );

注意!如果您需要对大量文件执行查询,这不是最好的方法。这只是一个草稿,可以帮助您获得想法。通过使用二分搜索算法在列表中查找特定文件,至少可以改进 mQuery func。

【讨论】:

【参考方案4】:

我创建了一个项目,其中我使用“Android Google DRIVE API V3”在其中创建文件夹、上传文件、删除文件和下载文件功能。 带有代码的完整 android 应用程序位于 https://github.com/prateekbangre/GoogleDrive_demo

文件夹是否存在:

public Task<String> isFolderPresent() 
    return Tasks.call(mExecutor, () -> 
        FileList result = mDriveService.files().list().setQ("mimeType='application/vnd.google-apps.folder' and trashed=false").execute();
        for (File file : result.getFiles()) 
            if (file.getName().equals(FOLDER_NAME))
                return file.getId();
        
        return "";
    );

创建文件夹:

public Task<String> createFolder() 
    return Tasks.call(mExecutor, () -> 
        File metadata = new File()
                .setParents(Collections.singletonList("root"))
                .setMimeType(FOLDER_MIME_TYPE)
                .setName(FOLDER_NAME);

        File googleFolder = mDriveService.files().create(metadata).execute();
        if (googleFolder == null) 
            throw new IOException("Null result when requesting Folder creation.");
        

        return googleFolder.getId();
    );

获取文件列表:

public Task<ArrayList<GoogleDriveFileHolder>> getFolderFileList() 

    ArrayList<GoogleDriveFileHolder> fileList = new ArrayList<>();

    if (folderId.isEmpty())
        Log.e(TAG, "getFolderFileList: folder id not present" );
        isFolderPresent().addOnSuccessListener(id -> folderId=id)
                .addOnFailureListener(exception -> Log.e(TAG, "Couldn't create file.", exception));
    

    return Tasks.call(mExecutor, () -> 
        FileList result = mDriveService.files().list()
                .setQ("mimeType = '" + SHEET_MIME_TYPE + "' and trashed=false and parents = '" + folderId + "' ")
                .setSpaces("drive")
                .execute();

        for (int i = 0; i < result.getFiles().size(); i++) 
            GoogleDriveFileHolder googleDriveFileHolder = new GoogleDriveFileHolder();
            googleDriveFileHolder.setId(result.getFiles().get(i).getId());
            googleDriveFileHolder.setName(result.getFiles().get(i).getName());

            fileList.add(googleDriveFileHolder);
        
        Log.e(TAG, "getFolderFileList: folderFiles: "+fileList );
        return fileList;
    );

将文件上传到谷歌驱动器:

public Task<Boolean> uploadFileToGoogleDrive(String path) 

    if (folderId.isEmpty())
        Log.e(TAG, "uploadFileToGoogleDrive: folder id not present" );
        isFolderPresent().addOnSuccessListener(id -> folderId=id)
                .addOnFailureListener(exception -> Log.e(TAG, "Couldn't create file.", exception));
    

    return Tasks.call(mExecutor, () -> 

        Log.e(TAG, "uploadFileToGoogleDrive: path: "+path );
        java.io.File filePath = new java.io.File(path);

        File fileMetadata = new File();
        fileMetadata.setName(filePath.getName());
        fileMetadata.setParents(Collections.singletonList(folderId));
        fileMetadata.setMimeType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

        FileContent mediaContent = new FileContent("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", filePath);
        File file = mDriveService.files().create(fileMetadata, mediaContent)
                .setFields("id")
                .execute();
        System.out.println("File ID: " + file.getId());

        return false;
    );

从谷歌驱动器下载文件:

public Task<Boolean> downloadFile(final java.io.File fileSaveLocation, final String fileId) 
    return Tasks.call(mExecutor, new Callable<Boolean>() 
        @Override
        public Boolean call() throws Exception 
            // Retrieve the metadata as a File object.
            OutputStream outputStream = new FileOutputStream(fileSaveLocation);
            mDriveService.files().get(fileId).executeMediaAndDownloadTo(outputStream);
            return true;
        
    );

删除文件:

public Task<Boolean> deleteFolderFile(final String fileId) 
    return Tasks.call(mExecutor, new Callable<Boolean>() 
        @Override
        public Boolean call() throws Exception 
            // Retrieve the metadata as a File object.
            if (fileId != null) 
                mDriveService.files().delete(fileId).execute();
                return true;
            
            return false;
        
    );

以上是相同的代码示例。

【讨论】:

Tasks.call 已从 Android 11 弃用

以上是关于有人可以为 Google Drive REST API v3 提供最新的 Android 指南吗?的主要内容,如果未能解决你的问题,请参考以下文章

通过Google Drive REST API上传或创建包含内容的新文件?

如何使用 GoogleDrive REST API 将大文件 (1 GB +) 上传到 Google Drive

使用 REST api 从 Google Drive 下载图片

如何将文件重命名为 google drive rest api?改造2

如何从 Google Drive 上传和下载文件(使用 Rest Api v3)

使用 Google Drive REST API 在 Swift 3 完成处理程序中避免向下转换