Список всех файлов на диске

Я хочу перечислить все файлы в корневой папке диска пользователя с помощью Google Drive API для Android.

Что я пробовал:

  1. использование SCOPE_FILE а также listChildren:

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

Затем перечислите файлы:

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!
        }
    }

Я нашел это SCOPE_FILE только список файлов, которые были созданы приложением, а не все файлы.

  1. использование https://www.googleapis.com/auth/drive объем

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

Сбой с исключением:

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)

Это должно работать так, или я что-то упустил?

2 ответа

Решение

Вы не можете перечислить все файлы (файлы, которые не были созданы вашим приложением) с помощью Google Drive API (библиотека Android). Вы должны использовать Google Drive REST API.

Область, которую вы пытаетесь использовать, предназначена для REST API.

Вот со страницы документов:

Примечание. API-интерфейс Android Drive работает только с областью https://www.googleapis.com/auth/drive.file. Это означает, что запрос может сопоставлять только файлы, которые пользователь открыл или создал в вашем приложении.

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

          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;
        }
    
    }
                      
    
             
Другие вопросы по тегам