Dima Kornilov
Dima Kornilov

Reputation: 2053

List all files in Drive

I want to list all files in Root folder of user's Drive using Google Drive API for Android.

What I've tried:

  1. Use SCOPE_FILE and listChildren:

    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addApi(Drive.API)
            .addScope(Drive.SCOPE_FILE)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build();
    

Then list files:

Drive.DriveApi.getRootFolder(mGoogleApiClient)
    .listChildren(mGoogleApiClient)
    .setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>() {
        @Override
        public void onResult(DriveApi.MetadataBufferResult result) {
            if (!result.getStatus().isSuccess()) {
                Log.v("DKDK", "Request failed");
                return;
            }
            MetadataBuffer metadataBuffer = result.getMetadataBuffer(); // empty!
        }
    }

I've found that SCOPE_FILE only list files that were created by the app, not all files.

  1. Use https://www.googleapis.com/auth/drive scope

    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addApi(Drive.API)
            .addScope(new Scope("https://www.googleapis.com/auth/drive"))
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build();
    

Fails with exception:

com.google.android.gms.drive.auth.c: Authorization failed: Unsupported scope: https://www.googleapis.com/auth/drive
at com.google.android.gms.drive.auth.g.a(SourceFile:86)
at com.google.android.gms.drive.api.e.<init>(SourceFile:230)
at com.google.android.gms.drive.api.a.q.a(SourceFile:71)
at com.google.android.gms.common.service.f.run(SourceFile:176)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at com.google.android.gms.common.util.a.c.run(SourceFile:17)
at java.lang.Thread.run(Thread.java:856)

Is it intended to work this way, or I'm missing something?

Upvotes: 6

Views: 4588

Answers (2)

Nirali Pandya
Nirali Pandya

Reputation: 44

    You can list all files with Google Drive API as below.
    #first step do signIn..

   private void requestSignIn() {
        googleSignInClient = buildGoogleSignInClient();
 someActivityResultLauncher.launch(googleSignInClient.getSignInIntent();
                                      

    }
private GoogleSignInClient buildGoogleSignInClient() {
    GoogleSignInOptions signInOptions =
            new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                    .requestScopes(new Scope("https://www.googleapis.com/auth/drive"))
                    //  .requestScopes(new Scope(DriveScopes.DRIVE_FILE))
                    .requestEmail()
                    .build();
    return GoogleSignIn.getClient(getApplicationContext(), signInOptions);
}

     ActivityResultLauncher<Intent> someActivityResultLauncher = registerForActivityResult(
                new ActivityResultContracts.StartActivityForResult(),
                new ActivityResultCallback<ActivityResult>() {
                    @Override
                    public void onActivityResult(ActivityResult result) {
                        if (result.getResultCode() == Activity.RESULT_OK) {
                            // There are no request codes
                            Intent resultData = result.getData();
                            handleSignInResult(resultData);
                        }
                    }
                });
      
    
      GoogleSignIn.getSignedInAccountFromIntent(result)
                    .addOnSuccessListener(googleAccount -> {
             
                       GoogleAccountCredential credential =
                                GoogleAccountCredential.usingOAuth2(
                                        this, Collections.singleton(DriveScopes.DRIVE_FILE));
                        credential.setSelectedAccount(googleAccount.getAccount());
                        Drive googleDriveService =
                                new Drive.Builder(
                                        AndroidHttp.newCompatibleTransport(),
                                        new GsonFactory(),
                                        credential)
                                        .setApplicationName("Drive API Migration")
                                        .build();
              mDriveServiceHelper = new 
                              GoogleDriveServiceHelper(googleDriveService);
                         
                                   getAll(googleAccount);
             })
                    .addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception exception) {
                            Log.e(TAG, "Unable to sign in.", exception);
                            showMessage("Unable to sign in.");
                           
                        }
                    });
    
        public void getAll(GoogleSignInAccount googleAccount) {
            DriveServiceHelper mDriveServiceHelper1 = new DriveServiceHelper(DriveServiceHelper.getGoogleDriveService(getApplicationContext(), googleAccount, "Screen mirroring"));
            mDriveServiceHelper1.queryFiles()
                    .addOnSuccessListener(new OnSuccessListener<List<GoogleDriveFileHolder>>() {
                        @Override
                        public void onSuccess(List<GoogleDriveFileHolder> googleDriveFileHolders) {
                            Gson gson = new Gson();
                            Intent intent = new Intent(GdriveMainActivity.this, ListActivity.class);
                            ListActivity.setdata(googleDriveFileHolders);
                            Log.e(TAG, "onSuccess: result: " + googleDriveFileHolders.size());
                            startActivity(intent);
                        }
                    })
                    .addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            Log.d(TAG, "onSuccess: " + e.getLocalizedMessage());
                        }
                    });
        }
    
    
    
    
    public class DriveServiceHelper {
       
     private final Executor mExecutor = 
                         Executors.newSingleThreadExecutor();
        private final Drive mDriveService;
    
        public DriveServiceHelper(Drive driveService) {
             mDriveService = driveService;
        }
    
        public static Drive getGoogleDriveService(Context context, GoogleSignInAccount account, String appName) {
            GoogleAccountCredential credential =
                    GoogleAccountCredential.usingOAuth2(
                            context,Collections.singleton("https://www.googleapis.com/auth/drive");
            credential.setSelectedAccount(account.getAccount());
            com.google.api.services.drive.Drive googleDriveService =
                    new com.google.api.services.drive.Drive.Builder(
                            AndroidHttp.newCompatibleTransport(),
                            new GsonFactory(),
                            credential)
                            .setApplicationName(appName)
                            .build();
            return googleDriveService;
        }
    
    
       
        public Task<List<GoogleDriveFileHolder>> queryFiles() {
            return Tasks.call(mExecutor, new Callable<List<GoogleDriveFileHolder>>() {
                        @Override
                        public List<GoogleDriveFileHolder> call() throws Exception {
                            List<GoogleDriveFileHolder> googleDriveFileHolderList = new ArrayList<>();
    
    
                            FileList result = mDriveService.files().list().execute();
    
                            for (int i = 0; i < result.getFiles().size(); i++) {
                                Log.d("TAG", "call: "+(result.getFiles().get(i)));
                                GoogleDriveFileHolder googleDriveFileHolder = new GoogleDriveFileHolder();
                                googleDriveFileHolder.setId(result.getFiles().get(i).getId());
                                googleDriveFileHolder.setName(result.getFiles().get(i).getName());
                                if (result.getFiles().get(i).getName() != null) {
                                    googleDriveFileHolder.setName(result.getFiles().get(i).getName());
                                }
    
                                if (result.getFiles().get(i).getModifiedTime() != null) {
                                  //  googleDriveFileHolder.setModifiedTime(result.getFiles().get(i).getModifiedTime());
                                }
    
                                if (result.getFiles().get(i).getCreatedTime() != null) {
                                   // googleDriveFileHolder.setCreatedTime(result.getFiles().get(i).getCreatedTime());
                                }
    
                                if (result.getFiles().get(i).getStarred() != null) {
                                   // googleDriveFileHolder.setStarred(result.getFiles().get(i).getStarred());
                                }
    
                                if (result.getFiles().get(i).getMimeType() != null) {
                                    //googleDriveFileHolder.setMimeType(result.getFiles().get(i).getMimeType());
                                }
                                googleDriveFileHolderList.add(googleDriveFileHolder);
    
                            }
    
    
                            return googleDriveFileHolderList;
    
    
                        }
                    }
            );
        }
    
        public Task<List<GoogleDriveFileHolder>> queryFiles(@Nullable final String folderId) {
            return Tasks.call(mExecutor, new Callable<List<GoogleDriveFileHolder>>() {
                        @Override
                        public List<GoogleDriveFileHolder> call() throws Exception {
                            List<GoogleDriveFileHolder> googleDriveFileHolderList = new ArrayList<>();
                            String parent = "root";
                            if (folderId != null) {
                                parent = folderId;
                            }
    
                            FileList result = mDriveService.files().list().setQ("'" + parent + "' in parents").setFields("files(id, name,size,createdTime,modifiedTime,starred,mimeType)").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());
                                if (result.getFiles().get(i).getSize() != null) {
                                    //googleDriveFileHolder.setSize(result.getFiles().get(i).getSize());
                                }
    
                                if (result.getFiles().get(i).getModifiedTime() != null) {
                                   // googleDriveFileHolder.setModifiedTime(result.getFiles().get(i).getModifiedTime());
                                }
    
                                if (result.getFiles().get(i).getCreatedTime() != null) {
                                  //  googleDriveFileHolder.setCreatedTime(result.getFiles().get(i).getCreatedTime());
                                }
    
                                if (result.getFiles().get(i).getStarred() != null) {
                                   // googleDriveFileHolder.setStarred(result.getFiles().get(i).getStarred());
                                }
                                if (result.getFiles().get(i).getMimeType() != null) {
                                    //googleDriveFileHolder.setMimeType(result.getFiles().get(i).getMimeType());
                                }
    
                                googleDriveFileHolderList.add(googleDriveFileHolder);
    
                            }
    
    
                            return googleDriveFileHolderList;
    
    
                        }
                    }
            );
        }
    
    
        /**
         * Returns an {@link Intent} for opening the Storage Access Framework file picker.
         */
        public Intent createFilePickerIntent() {
            Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
            intent.addCategory(Intent.CATEGORY_OPENABLE);
            intent.setType("text/plain");
    
            return intent;
        }
    
    }
                      
    
             

Upvotes: 0

Ilya Tretyakov
Ilya Tretyakov

Reputation: 7010

You can't list all files (files that wasn't created by your app) with Google Drive API (Android library). You should use Google Drive REST API.

The scope that you are trying to use is for REST API.

Here is from docs page:

Note: The Android Drive API only works with the https://www.googleapis.com/auth/drive.file scope. This means that only files which a user has opened or created with your application can be matched by a query.

https://developers.google.com/drive/android/queries

Upvotes: 11

Related Questions