Reputation: 2053
I want to list all files in Root folder of user's Drive using Google Drive API for Android.
What I've tried:
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.
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
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
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