Intereting Posts
Пользовательская плотность экрана на эмуляторе Android Как правильно отвязать услуги Как получить продолжительность видеофайла? Setupportactionbar () выдает ошибку Открыть пользовательский диалог при выборе текста веб-просмотра Android Nougat clipPath не работает во время анимации Android-приложение аварийно завершает работу, но не перезагружается – возобновляет работу с другой точки приложения Google Play Store дает дополнительные кредиты пользователю? Android: Определите, какой код работает AsyncTask Только исходный поток, создавший иерархию представлений, может коснуться его представлений Android – Proguard возвращается с кодом ошибки 1. См. Консоль Twitter4J + Android: вызов аутентификации – это исключение для Null Поверните растровое изображение с помощью рендеринга скрипта android Что такое crittercism_v3_0_3_sdkonly используется в jfeinstein10 / SlidingMenu? Android – ObjectAnimator устанавливает значение поворота

Firebase Storage v3 возвращает «многочастное тело не содержит 2 или 3 части» на Android 4.2.2 и 4.3

Я создаю приложение Ionic для развертывания на Android 5 и 4. Когда я пытаюсь использовать firebase v3 storage ref (используя firebase.js API), чтобы сохранить Blob на Android 4.2.2 и 4.3, он терпит неудачу:

code: "storage/unknown" message: "Firebase Storage: An unknown error occurred, please check the error payload for server response." serverResponse: "multipart body does not contain 2 or 3 parts." name: "FirebaseError" 

Однако это отлично работает на устройствах Android 5.0.1 и 4.4.2.

Вопрос: Является ли это жестким ограничением версий Android (или включенного веб-сайта)? Или некоторая несовместимость в API firebase.js, которую я использую? Я пытаюсь понять, может ли проблема быть исправлена ​​или если ничего не поделаешь.

Единственное другое упоминание об этом сообщении об ошибке, которое я мог найти, было здесь: https://github.com/davideast/firebase-react-native-sample/issues/5

Но, видя, что это приложение с ионной оболочкой, у меня есть доступ к типу Blob.

Файл создается путем съемки с использованием удлинителя камеры cordova-plugin, сохраняя его на локальном хранилище телефонов с Camera.DestinationType.FILE_URI

Затем он считывается обратно в Blob, используя расширение cordova-plugin-file, перед тем, как быть сохраненным в хранилище Firebase (в частности, хранилище с хранилищем Google Cloud Store, поскольку оно использует firebase v3).

Кажется, что Blob был создан успешно (хотя он может вернуться к использованию BlobBuilder, если новый конструктор Blob недоступен – см. Фрагмент кода)

Соответствующий раздел кода (изнутри контроллера AngularJS) выглядит так:

 var makeBlob = function(data, mimeString) { try { return new Blob([data], { type: mimeString }); } catch (err) { var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder; var bb = new BlobBuilder(); bb.append(data); return bb.getBlob(mimeString); } }; $scope.uploadLocalImageAsync = function(localImageFileUrl, responseKey, description) { var deferred = $q.defer(); $window.resolveLocalFileSystemURL(localImageFileUrl, function fileEntrySuccess(fileEntry) { fileEntry.file(function fileSuccess(file) { var reader = new FileReader(); reader.onloadend = function(evt) { try { var imageBlob = makeBlob(evt.target.result, 'image/jpeg'); alert("imageBlob: " + JSON.stringify(imageBlob)); var metadata = { contentType: 'image/jpeg', customMetadata: { 'response': responseKey, 'description': description } }; // Create a root reference var storageRef = firebase.storage().ref(); var fileRef = storageRef.child('images/' + responseKey + '/' + file.name); var uploadTask = fileRef.put(imageBlob, metadata); uploadTask.on('state_changed', function(snapshot) { // Observe state change events such as progress, pause, and resume // See below for more detail alert(JSON.stringify(snapshot)); }, function(error) { // Handle unsuccessful uploads alert(JSON.stringify(error)); deferred.reject("Upload failed: " + error.code + ": " + error.message) }, function() { // Handle successful uploads on complete // For instance, get the download URL: https://firebasestorage.googleapis.com/... var downloadURL = uploadTask.snapshot.downloadURL; deferred.resolve({ gsPath: fileRef.toString(), downloadUrl: downloadURL }); }); } catch (err) { deferred.reject("onloadend error: " + err); } }; try { reader.readAsArrayBuffer(file); } catch (err) { deferred.reject("readAsArrayBuffer error: " + err); } }, function fileFailure() { deferred.reject("Couldn't make File object"); }); }, function fileEntryFailure() { deferred.reject("Couldn't find fileEntry for image"); }); return deferred.promise; }; 

LocalImageFileUrl имеет вид: "file: ///storage/sdcard0/Android/data/com.ionicframework.myapp/cache/1471426280702.jpg"

Функция фактически возвращает обещание, которое разрешается позже в другой части контроллера AngularJS.

Сбой происходит после запуска uploadTask.

Опять же, это работает на Android 5.0.1, 4.4.2, но не работает на 4.3, 4.2.2

Я надеюсь, что в Ионе есть какие-то дополнительные настройки или что-то, что мне не хватает. Но я действительно просто не знаю, что вызывает разницу в поведении, или если я что-то могу с этим поделать.


Вещи, которые я пробовал :

Я попытался понизить платформу android-платформы cordova до 3.5, чтобы специально настроить Android-17 (4.2.2) (используя что-то похожее здесь https://stackoverflow.com/a/32672214/6729807 ), но он производит ту же ошибку.

(Я также понизил различные плагины до соответствующих уровней)


Некоторая информация о версиях используемых инструментов :

Ионная информация:

Ваша системная информация:

 Cordova CLI: 6.3.1 Ionic Framework Version: 1.3.1 Ionic CLI Version: 2.0.0 Ionic App Lib Version: 2.0.0-beta.20 OS: Node Version: v4.4.7 

Ионная версия платформы Android:

 Installed platforms: android 5.2.1 

/platforms/android/AndroidManifest.xml

 <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="23" /> 

/platforms/android/project.properties (и project.properties CordovaLib)

 target=android-23 

Установленные плагины:

 cordova-plugin-camera cordova-plugin-compat cordova-plugin-file cordova-plugin-geolocation cordova-plugin-whitelist 

Используя https://www.gstatic.com/firebasejs/3.3.0/firebase.js

И https://github.com/firebase/angularfire (release v2.0.1)

 The resolving key was using RNFetchBlob.polyfill.XMLHttpRequest; import RNFetchBlob from 'react-native-fetch-blob'; const Blob = RNFetchBlob.polyfill.Blob; window.XMLHttpRequest = RNFetchBlob.polyfill.XMLHttpRequest; window.Blob = Blob; install package - https://github.com/wkh237/react-native-fetch-blob and execute code - https://github.com/wkh237/rn-firebase-storage-upload-sample/blob/master/index.common.js also read http://stackoverflow.com/questions/39160006/react-native-firebase-storage-upload-using-putstring-call