Google Drive API для Android - CreateFile успешно выполняется, но файл не отправляется в облако - PullRequest
0 голосов
/ 12 сентября 2018

Я интегрирую свое приложение 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% всех отправляемых файлов (все статусы загрузки выполнены успешно).

Кто-нибудь из вас сталкивался с подобными проблемами до сих пор? Есть ли у вас какие-либо советы, что можно сделать, чтобы сделать файл загружаемым, если все методы загрузки утверждают, что все прошло успешно?

Большое спасибо заранее за любые подсказки:)

...