Кордова видео / аудио не будет воспроизводиться из cdvfile: // URL-адреса после обновления до 3.3.0

Приложение My Cordova загружает аудиофайлы с сервера и делает их доступными для воспроизведения, когда устройство находится в автономном режиме. Все это работало до вчерашнего дня, когда я обновился до последней версии.

Первоначально ни загрузка (через плагин передачи файлов), ни воспроизведение (через плагин для мультимедиа) не будут работать. fileSystem.root.fullPath его далее, я обнаружил, что fileSystem.root.fullPath теперь возвращает путь относительно корневой папки локальных веб-приложений приложений, но он использовал для возврата полного пути. Теперь Кордова рекомендует вместо этого использовать fileSystem.root.toURL() ( http://cordova.apache.org/news/2014/02/10/plugins-release.html ). Это действительно устранило проблему передачи файлов.

Однако использование новой схемы URL не работает для аудиофайлов. При попытке воспроизведения файла я получаю сообщение об ошибке "Cannot use audio file from resource 'cdvfile://localhost/persistent/path/to/file'" .

Проверяя отслеживание проблемы в Кордове, я обнаружил, что кто-то сообщил о той же проблеме для видеофайлов ( https://issues.apache.org/jira/browse/CB-6051 ).

Казалось бы, Кордова не обновила плагин CDVSound, чтобы обрабатывать новый формат имени файла, но он все равно может работать, если я могу получить доступ к конечному пути, как и раньше. Я просмотрел новый код и документы, но не нашел способа сделать это.

Кто-нибудь смог получить полный путь от плагина файла?

Solutions Collecting From Web of "Кордова видео / аудио не будет воспроизводиться из cdvfile: // URL-адреса после обновления до 3.3.0"

Я получил его для видео, используя ветви dev для передачи файлов и файлов. Они добавили функцию в класс Entry, названный toNativeURL. Вам нужно загрузить zip-файлы из проектов github:

https://github.com/apache/cordova-plugin-file-transfer/tree/dev

https://github.com/apache/cordova-plugin-file/tree/dev

https://github.com/apache/cordova-plugin-media/tree/dev

Затем установите их в проект:

 cordova plugin rm org.apache.cordova.file-transfer cordova plugin rm org.apache.cordova.file cordova plugin rm org.apache.cordova.media cordova plugin add <path_to_unzipped_dev_branch_of_file_plugin> cordova plugin add <path_to_unzipped_dev_branch_of_file-transfer_plugin> cordova plugin add <path_to_unzipped_dev_branch_of_media_plugin> 

Это пример, который я получил:

 <!DOCTYPE html> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <html> <head> <meta charset="utf-8" /> <meta name="format-detection" content="telephone=no" /> <!-- WARNING: for iOS 7, remove the width=device-width and height=device-height attributes. See https://issues.apache.org/jira/browse/CB-4323 --> <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height, target-densitydpi=device-dpi" /> <link rel="stylesheet" type="text/css" href="css/index.css" /> <title>Hello World</title> </head> <body> <div id="main" class="app"> <h1>Apache Cordova</h1> <div id="deviceready" class="blink"> <p class="event listening">Connecting to Device</p> <p class="event received">Device is Ready</p> </div> <div id="messages"> Loading Video... </div> <video width="320px" height="240px" controls></video> </div> <script type="text/javascript" src="cordova.js"></script> <script type="text/javascript" src="js/index.js"></script> <script type="text/javascript"> app.initialize(); document.addEventListener("deviceready", onDeviceReady, false); // device APIs are available // function onDeviceReady() { console.log('Requesting file system'); window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, gotFS, fail); } function gotFS(fileSystem) { fileSystem.root.getDirectory("vids", {create: true}, gotDir); } function gotDir(dirEntry) { dirEntry.getFile("video.mp4", {create: true, exclusive: false}, gotFile); } function gotFile(fileEntry) { var localPath = fileEntry.fullPath; var localUrl = fileEntry.toURL(); console.log('Loaded local path: ' + localPath); console.log('Loaded local url: ' + localUrl); var fileTransfer = new FileTransfer(); var uri = encodeURI('http://<url_to_video>.mp4'); console.log('Downloading ' + uri + ' to ' + localPath); fileTransfer.download( uri, localUrl, function(entry) { console.log('download complete (path): ' + entry.fullPath); console.log('download complete (url): ' + entry.toURL()); console.log('download complete (native): ' + entry.toNativeURL()); document.getElementById('messages').innerHTML = 'Downloaded Video path: ' + entry.fullPath + '<br />' + 'Downloaded Video url: ' + entry.toURL() + '<br />' + 'Downloaded Video Native url: ' + entry.toNativeURL() + '<br />'; var videoNode = document.querySelector('video'); videoNode.src = entry.toNativeURL(); }, function(error) { console.log('download error source ' + error.source); console.log('download error target ' + error.target); } ); } function fail(error) { console.log('Error creating file [' + error.name + ']: ' + error.message); } </script> </body> </html> 

Если он работает с видео, он определенно должен работать с аудио.

В этой ветке исправлена ​​ветка разработки плагинов [Media] [1] и File. Если вы можете установить эти плагины из git, тогда игра с URL-адресов cdvfile:// должна работать.

Я отправлю сообщение здесь, когда этот код также будет выпущен.

Обновление. С 2014-03-04 исправлены исправления для Media и File. Файлы 1.0.1 и Media 0.2.9 работают вместе, чтобы воспроизводить аудио с URL-адресов cdvfile.

У меня все еще нет ответа на получение полного пути, но я решил взломать плагин iOS, пока не будет исправлено исправление от Кордовы. (По крайней мере, я могу продолжить работу с разработчиком на данный момент.)

Следующий код был взят из плагина file-transfer и может быть добавлен в CDVSound.m, чтобы позволить плагину мультимедиа воспроизводить аудиофайлы с новыми cdvfile:// paths, iOS. Однако будьте осторожны, я никогда раньше не писал линию ObjC, и код вряд ли тестировался. Это временное исправление, пока Кордова не исправляет текущий плагин.

 #import "CDVSound.h" #import "CDVFile.h" <-- add #import <Cordova/NSArray+Comparisons.h> ... #define RECORDING_WAV @"wav" #define CDVFILE_PREFIX @"cdvfile://" <-- add extern CDVFile *filePlugin; <-- add @implementation CDVSound ... filePath = [resourcePath stringByReplacingOccurrencesOfString:DOCUMENTS_SCHEME_PREFIX withString:[NSString stringWithFormat:@"%@/", docsPath]]; NSLog(@"Will use resource '%@' from the documents folder with path = %@", resourcePath, filePath); <--- insert this block here ---> } else if ([resourcePath hasPrefix:CDVFILE_PREFIX]) { CDVFilesystemURL *fsURL = [CDVFilesystemURL fileSystemURLWithString:resourcePath]; if (fsURL && fsURL.fileSystemName != nil) { // This requires talking to the current CDVFile plugin NSObject<CDVFileSystem> *fs = [filePlugin filesystemForURL:fsURL]; if ([fs respondsToSelector:@selector(filesystemPathForURL:)]) { filePath = [fs filesystemPathForURL:fsURL]; NSLog(@"Will use resource '%@' from the documents folder with path = %@", resourcePath, filePath); } else { resourceURL = fsURL.url; } } else { NSLog(@"Unknown resource '%@'", resourcePath); } <--- to here ---> } else { // attempt to find file path in www directory or LocalFileSystem.TEMPORARY directory