Я интегрирую свое приложение Xamarin.Android с Google Drive API. Моя главная проблема заключается в том, что, хотя все вызовы API заканчиваются успешно, некоторые из моих двоичных файлов не сохраняются в Google Диске.
Я пытаюсь отправить 5-10 аудиофайлов (wav, mp3, ogg и т. Д.) Размером 10-80 МБ каждый.
Вот мой подход к отправке двоичных файлов:
string mimeType = GetMimeType(localFilePath);
string fullSourceFilePath = Path.Combine(documentsPath, localFilePath);
byte[] buffer = new byte[BinaryStreamsBufferLength];
using (var contentResults = await DriveClass.DriveApi.NewDriveContentsAsync(_googleApiClient).ConfigureAwait(false))
{
if (contentResults.Status.IsSuccess) //always returns true
{
using (var readStream = System.IO.File.OpenRead(fullSourceFilePath))
{
using (var fileChangeSet = new MetadataChangeSet.Builder()
.SetTitle(path[1])
.SetMimeType(mimeType)
.Build())
{
using (var writeStream = new BinaryWriter(contentResults.DriveContents.OutputStream))
{
int bytesRead = readStream.Read(buffer, 0, BinaryStreamsBufferLength);
while (bytesRead > 0)
{
writeStream.Write(buffer, 0, bytesRead);
bytesRead = readStream.Read(buffer, 0, BinaryStreamsBufferLength);
}
writeStream.Close();
}
readStream.Close();
var singleFileCopyResult = await targetCloudFolder.CreateFileAsync(_googleApiClient, fileChangeSet, contentResults.DriveContents,
new ExecutionOptions.Builder().SetConflictStrategy(ExecutionOptions.ConflictStrategyOverwriteRemote).Build()).ConfigureAwait(false);
return singleFileCopyResult.Status.IsSuccess; //always returns true
}
}
}
}
Указанный выше метод вызывается в цикле foreach со списком локально сохраненных файлов, которые необходимо отправить.
Также при первом подключении к API запрашиваю Sync:
if (_isSyncRequired)
syncResult = await DriveClass.DriveApi.RequestSyncAsync(_googleApiClient).ConfigureAwait(false);
Я уже после нескольких дней пробую различные решения, включая:
- изменение типов потоков
- изменение порядка вызовов методов API
- использование не асинхронных методов API (которые на самом деле также являются асинхронными)
- по возможности экспериментировал с различными перегрузками и параметрами
- попытался изменить рефакторинг на устаревшие вызовы API (это невозможно сделать, так как для этого требуется сверхтяжелый GoogleSignIn NuGet с множеством зависимостей, а мое приложение достаточно тяжелое)
Ничего из вышеперечисленного не сработало, и мои файлы позже были успешно загружены примерно в 80% всех отправляемых файлов (все статусы загрузки выполнены успешно).
Кто-нибудь из вас сталкивался с подобными проблемами до сих пор? Есть ли у вас какие-либо советы, что можно сделать, чтобы сделать файл загружаемым, если все методы загрузки утверждают, что все прошло успешно?
Большое спасибо заранее за любые подсказки:)