2014-12-11 3 views
7

Использование метеора без Кордовы я могу играть звуковой штраф в моем браузере, используяPlay Sound В Метеоре-Кордове App

new Audio('test.mp3').play() 

где test.mp3 находится в общей папке. Однако я не могу воспроизвести звук, как только я запустил приложение в качестве приложения cordova на устройстве. Что я делаю не так? Благодарю.

+0

Вы пытались: 'new Audio ('/ test.mp3'). Play()'? – stubailo

+0

@stubailo Я сделал это. – Nate

+0

Вам удалось найти что-либо, что не требовало бы другого запроса (http)? – jimmiebtlr

ответ

6

Tl; др

  1. Установка Cordova медиа плагин meteor add cordova:[email protected]

  2. Добавить аудио файлов в общедоступный каталог

  3. Использование /android_asset/www/application/path/to/sound.wav

Если вы посмотрите в этой папке в вашем проекте,

$PROJECT_ROOT/.meteor/local/cordova-build/platforms/android/assets/www/

Вы увидите ваше приложение в Кордове построена это для андроида.

Использование плагина Cordova Media, я попытался использовать путь к файлу /android_asset/www/path/to/sound.wav безрезультатно.

# Install the cordova media plugin with this command 
meteor add cordova:[email protected] 

Вместо этого я увидел, что моя папка звуков находилась внутри каталога www, но под каталогом приложений. Таким образом, этот путь к файлу в конечном итоге работает для меня,

/android_asset/www/application/path/to/sound.wav

Вот соответствующий код, который работал для меня.

function getMediaUrl(sound) { 

    if (device.platform.toLowerCase() === "android") { 

    return cordova.file.applicationDirectory.replace('file://', '') + 'www/application/' + sound.substr(1); 

    } 
    else { 

    return cordova.file.applicationDirectory.replace('file://', '') + sound.substr(1); 

    } 

} 

function playSound(sound) { 

    return new Media(

    getMediaUrl(sound), 

    function (success) { 
     // success 
    }, 
    function (err) { 
     // error 
    } 
); 
} 

var test = playSound('/sounds/test.wav'); 

test.play(); 

ПРИМЕЧАНИЕ: Я включил мои аудио файлы в общей папке т.е.

$PROJECT_ROOT/public/sounds/test.wav

и на Android, этот путь к файлу переводится на

/android_asset/www/application/sounds/test.wav

+1

Для iOS мне пришлось использовать это: 'return cordova.file.applicationDirectory.replace ('file: //', '') + 'www/application /' + sound.substr (1); 'Так что эта часть предназначена не только для android. – user3330705

+0

^Да, они оба одинаковые. – Mirrorcell

+1

Спасибо! Оно работает! Я использовал 'cdvfile: //' вместо 'file: //' ... и 'www/application/app /' вместо 'www/application /'. – Yong

2

Возможно, существует два возможных решения. Первое, что, вероятно, является более правильным решением, применимо только для приложений cordova. Он не будет работать в браузере из-за зависимости плагина. Первый шаг заключается в добавлении Cordova плагин:

meteor add cordova:[email protected] 

Далее построить функцию для воспроизведения звука:

playLimitSound = function() { 
    if (Meteor.isCordova) { 
     var my_media = new Media('http://MY_IP:port/test.mp3', 
      // success callback 
      function() { 
       console.log("playAudio():Audio Success"); 
      }, 
      // error callback 
      function (err) { 
       console.log("playAudio():Audio Error: " + err); 
      } 
     ); 
     // Play audio 
     my_media.play(); 
} 

};

Это еще одно решение. Он работает как в браузере, так и в cordova-приложении.

new Audio('http://MY_IP:port/test.mp3').play() 
+0

Это не будет так хорошо на Кордове, потому что тогда он загрузит звук с веб-сервера, а не с локального устройства. – stubailo

+0

@stubailo спасибо, см. Правки. – Nate

1

У меня была аналогичная проблема с звуковым уведомлением iOS. Он был решен, когда я добавляю звуковые файлы в папку «Ресурсы» в Xcode перед компиляцией приложения Xcode. В этом случае вы можете обратиться к нему как:

if (Meteor.isCordova) { 
    var NotificationHandler = function(evt) { 
    if (evt.sound) { 
     var snd = new Media( 
     Meteor.absoluteUrl(evt.sound), 
     function() { console.log('media ok'); }, 
     function(err) { console.log('media error',err); } 
    ); 
     snd.play(); 
    } 
    }; 
} 

где evt.sound, например, 'test.mp3'

и я медиа плагин установлен как

meteor add cordova:[email protected] 
+0

В примере кода вы используете absoluteUrl, который разрешает «http: // URL: PORT/resource_location» Когда вы говорите, добавьте его в папку ресурсов, о каком именно пути мы говорим? Что-то вроде 'public/resources/sound.wav'? – jimmiebtlr

+0

Путь в вашей кордобовой сборке, а не в общедоступном каталоге проекта Meteor. для iOS лучшим способом является просто перетащить их в каталог ресурсов Xcode вашего проекта. Затем Xcode добавляет их как ресурсы (так же добавляются значки и всплеск) ... – solo999

1

Если вы действительно хотите воспроизводить звук локально (без подключения к интернету) th ru необходимо изменить адрес вашего хоста на:

http://meteor.local/[your_subfolder(s)_if_you_got]/your.mp3 

С помощью этого URL-адреса вы можете, конечно же, воспользоваться упомянутыми вызовами Media или Audio. Если ваши активы находятся в общей папке или папке с ресурсами, вы всегда можете использовать этот URL в соответствии с проектом, эти файлы будут скопированы в ваш пакет приложений.

+0

Это не работает для меня. – Pueggel

+0

Какую версию Meteor вы используете? С Meteor 1.3 он изменился. – ddresch

+0

Также не работает для меня. Я на Meteor 1.4.что-то. – MastaBaba

1

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

В конце концов, это то, что работал для меня:

 var player = new window.Audio(); 

     var xhr = new XMLHttpRequest(); 
     xhr.onreadystatechange = function() { 
      if (this.readyState == 4 && this.status == 200) { 
       player.src = window.URL.createObjectURL(this.response); 
       player.play(); 
      } 
     }; 
     xhr.open('GET', "/audio.mp3"); 
     xhr.responseType = 'blob'; 
     xhr.send(); 

От here.