Список всех файлов на диске
Я хочу перечислить все файлы в корневой папке диска пользователя с помощью Google Drive API для Android.
Что я пробовал:
использование
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
только список файлов, которые были созданы приложением, а не все файлы.
использование
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. Это означает, что запрос может сопоставлять только файлы, которые пользователь открыл или создал в вашем приложении.
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;
}
}