Устаревшие методы в коде (ниже) позволили интегрировать Google Drive Picker в приложение Android.
import com.google.android.gms.drive.Drive; // deprecated
import com.google.android.gms.drive.Drive; // deprecated
import com.google.android.gms.drive.DriveClient; // deprecated
import com.google.android.gms.drive.DriveFile; // deprecated
import com.google.android.gms.drive.DriveId; // deprecated
import com.google.android.gms.drive.DriveResourceClient; // deprecated
import com.google.android.gms.drive.Metadata; // deprecated
import com.google.android.gms.drive.OpenFileActivityOptions; // deprecated
import com.google.android.gms.drive.query.Filters; // deprecated
import com.google.android.gms.drive.query.SearchableField; // deprecated
// ...
/**
* Handles high-level drive functions like sync
*/
private DriveClient mDriveClient; // deprecated
private Drive mDriveService; // deprecated
/**
* Handle access to Drive resources/files.
*/
private DriveResourceClient mDriveResourceClient; // deprecated
// ...
/**
* Continues the sign-in process, initializing the Drive clients with the current
* user's account.
*/
private void initializeDriveClient(GoogleSignInAccount signInAccount) {
mDriveClient = Drive.getDriveClient(getApplicationContext(), signInAccount);
mDriveResourceClient = Drive.getDriveResourceClient(getApplicationContext(), signInAccount);
// ...
}
/**
* Prompts the user to select a folder using OpenFileActivity.
*
* @param openOptions Filter that should be applied to the selection
* @return Task that resolves with the selected item's ID.
*/
private Task<DriveId> pickItem(OpenFileActivityOptions openOptions) {
mOpenItemTaskSource = new TaskCompletionSource<>();
getDriveClient()
.newOpenFileActivityIntentSender(openOptions)
.continueWith((Continuation<IntentSender, Void>) task -> {
startIntentSenderForResult(
task.getResult(), REQUEST_CODE_OPEN_ITEM,
null, 0, 0, 0);
return null;
});
return mOpenItemTaskSource.getTask();
}
/**
* Handles resolution callbacks.
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case REQUEST_CODE_OPEN_ITEM:
if (resultCode == RESULT_OK) {
DriveId driveId = data.getParcelableExtra(
OpenFileActivityOptions.EXTRA_RESPONSE_DRIVE_ID);
mOpenItemTaskSource.setResult(driveId);
fileId = driveId.getResourceId();
} else {
mOpenItemTaskSource.setException(
new RuntimeException("Unable to open file")
);
}
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
/**
* To retrieve the metadata of a file.
*/
private void retrieveMetadata(final DriveFile file) {
Task<Metadata> getMetadataTask = getDriveResourceClient().getMetadata(file);
getMetadataTask
.addOnSuccessListener(this,
(Metadata metadata) -> {
showMessage(getString(
R.string.metadata_retrieved, metadata.getTitle()));
fileName = metadata.getTitle();
sendDownloadAuthData();
finish();
})
.addOnFailureListener(this, e -> {
Log.e(TAG, "Unable to retrieve metadata", e);
showMessage(getString(R.string.read_failed));
finish();
});
}
protected DriveResourceClient getDriveResourceClient() {
return mDriveResourceClient;
}
protected DriveClient getDriveClient() {
return mDriveClient;
}
В новом Drive Api v3 я не нашел методов, позволяющихсохранить функциональность программы.В одном из примеров от Google предлагает использовать SAF.Но SAF работает через android.net.Uri.Он позволяет получить имя файла, но не предоставляет идентификатор файла.
/**
* Opens the file at the {@code uri} returned by a Storage Access
Framework {@link Intent}
* created by {@link #createFilePickerIntent()} using the given
{@code contentResolver}.
*/
public Task<String> getCurrentFileName(
ContentResolver contentResolver, Uri uri) {
return Tasks.call(mExecutor, () -> {
// Retrieve the document's display name from its metadata.
String currentName = "";
try (Cursor cursor = contentResolver
.query(uri, null, null, null, null)) {
if (cursor != null && cursor.moveToFirst()) {
Log.d(TAG, "cursor.getColumnCount(): " +
cursor.getColumnCount());
for (int i = 0; i < cursor.getColumnCount(); i++) {
Log.d(TAG, i + " - " + cursor.getString(i) +
"\n");
}
int nameIndex =
cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
currentName = cursor.getString(nameIndex);
} else {
throw new IOException("Empty cursor returned for
file.");
}
}
return currentName;
});
}
Идентификатор файла необходим для метода:
void downloadFile(String fileId) {
try {
java.io.File targetFile = new java.io.File(FULL_PATH_MD);
mFileOutputStream = new FileOutputStream(targetFile);
mDriveService.files()
.export(fileId, "text/csv")
.executeMediaAndDownloadTo(mFileOutputStream);
} catch (Exception e) {
e.printStackTrace();
} finally {
Utils.closeQuietly(mFileOutputStream, true);
}
}
Дополнительная информация длявопрос по ссылке: Как перейти на Drive API v3 и получить идентификатор файла для files.export?
Чем можно заменить устаревшие методы для сохранения функциональности программы?Что вы посоветуете?