2014-03-29 33 views
4

在我的應用程序中,我在鼠標單擊時發出了聲音響應。這就是我所做的Phonegap在調用playAudio()後停止播放30到40次

我稱這樣

<center><input id="click_flip" type="button" value="Click Me" class="clickme" onclick="callplay()"></center> 

這裏的功能是功能

<script type="text/javascript" charset="utf-8"> 

     function callplay() 
     { 
             if(voice=="male") 
             playAudio('/android_asset/www/Mobile/sound/Male/'+rand1+'.mp3'); 
             else 
             playAudio('/android_asset/www/Mobile/sound/Female/'+rand1+'.mp3'); 
     } 
     // Audio player 
     // 

     var my_media = null; 

     // Play audio 
     // 
     function playAudio(src) { 




       // Create Media object from src 

       my_media = new Media(src, onSuccess, onError); 
      // else play current audio 
      // Play audio 
      my_media.play(); 



     } 





     // onSuccess Callback 
     // 
     function onSuccess() { 
      console.log("playAudio():Audio Success"); 
     } 

     // onError Callback 
     // 
     function onError(error) { 
     // alert('code: ' + error.code + '\n' + 
        'message: ' + error.message + '\n'); 
     } 


     </script> 

但是,當我重複按鈕,點擊多(約30至40)倍。聲音沒有給出任何迴應。

,使用這種link後,我已經加入此功能

if(my_media){ 
    my_media.stop(); 
    my_media.release(); 
} 

也試過這種

function playAudio(url) { 
    try { 

     var my_media = new Media(url, 
      // success callback 
      function() { 
       **my_media.release();** 
      }, 
      // error callback 
      function (err) { 
       **my_media.release();** 
      }); 

     // Play audio 
     my_media.play(); 
    } catch (e) { 
     alert(e.message); 
    } 
} 

,但不工作。請建議

回答

0

我有同樣的問題,我現在嘗試用這種方式,似乎工作:

var my_media = null; 

function playAudio(src) 
{ 
    if(my_media != null) my_media.release(); 
    my_media = new Media(src); 
    my_media.play(); 
} 

如果你釋放你不硬件需要停下來,因爲釋放自動停止當前媒體在android中。不知何故,如果你嘗試在成功或錯誤回調中釋放,它並不總是工作。有些時候當媒體尚未完成時我嘗試播放,這會中斷媒體對象。

0

在我的情況下,我有掃描應用程序與手機差距。 當掃描失敗時,通過我們的API掃描票證,它會振動併發出蜂鳴聲失敗。 ,通過我們的API掃描票證,沒有振動就能成功。

經過35至40次後,它無法振動或播放聲音。

代碼修復前:

在HTML

<audio id="successSound" 
     src="/android_asset/www/audio/correct.mp3" 
     type="audio/mpeg"> 
    </audio> 



var my_media = null; 
var mediaTimer = null; 

function playAudio(id) { 
    var audioElement = document.getElementById(id); 
    var src = audioElement.getAttribute('src'); 
    // Create Media object from src 
    // alert(src); 
    // alert(getPathMedia()); 
    my_media = new Media(src, onSuccess, onError); 

    // Play audio 
    my_media.play(); 

    // Update my_media position every second 
    if (mediaTimer == null) { 
     mediaTimer = setInterval(function() { 
      // get my_media position 
      my_media.getCurrentPosition(
       // success callback 
       function(position) { 
        if (position > -1) { 
         setAudioPosition((position) + " sec"); 
        } 
       }, 
       // error callback 
       function(e) { 
        console.log("Error getting pos=" + e); 
        setAudioPosition("Error: " + e); 
       } 
      ); 
     }, 1000); 
    } 
} 

// Pause audio 
function pauseAudio() { 
    if (my_media) { 
     my_media.pause(); 
    } 
} 

// Stop audio 
function stopAudio() { 
    if (my_media) { 
     my_media.stop(); 
    } 
    clearInterval(mediaTimer); 
    mediaTimer = null; 
} 

// onSuccess Callback 
// 
function onSuccess() { 
    // alert('success'); 
} 

// onError Callback 
function onError(error) { 
    switch(error.code){ 
     case MediaError.MEDIA_ERR_ABORTED: 
     alert('MEDIA_ERR_ABORTED code: ' + error.code); 
     break; 
     case MediaError.MEDIA_ERR_NETWORK: 
     alert('MEDIA_ERR_NETWORK code: ' + error.code); 
     break; 
     case MediaError.MEDIA_ERR_DECODE: 
     alert('MEDIA_ERR_DECODE code: ' + error.code); 
     break; 
     case MediaError.MEDIA_ERR_NONE_SUPPORTED: 
     alert('MEDIA_ERR_NONE_SUPPORTED code: ' + error.code); 
     break; 
     default: 
     { 
      alert('Un Known: ' + error.code); 
      navigator.notification.vibrate(2000); 
      playAudio("errorSound"); 
     } 
    } 
} 

function setAudioPosition(position) { 
    document.getElementById('audio_position').innerHTML = position; 
} 

代碼修復後:

var failCounter = 0; 
var successCounter = 0; 

var srcSuccess = "/android_asset/www/audio/correct.mp3"; 
var srcFail = "/android_asset/www/audio/error_long.mp3"; 

var my_media_success = null; 
var my_media_fail = null; 
function playAudioSuccess() { 
    // stopAudio(my_media); 
    if (my_media_success != null) { 
     my_media_success.release(); 
    } 
    successCounter = successCounter + 1; 
    // Create Media object from src 
    // alert(src); 
    // alert(getPathMedia()); 
    try { 
     my_media_success = new Media(srcSuccess, onSuccess, onError); 
     // my_media.setVolume('1.0'); 
     // if (successCounter >= 35) { 
     //  alert("success count " + successCounter + " total counting " + (successCounter + failCounter)); 
     // } 
     // Play audio 
     my_media_success.play(); 

    } catch (err) { 
     alert(err); 
    } 

} 

function playAudioFail() { 
    try { 
     // stopAudio(my_media); 
     if (my_media_fail != null) { 
      my_media_fail.release(); 
     } 

     failCounter = failCounter + 1; 
     // Create Media object from src 
     // alert(src); 
     // alert(getPathMedia()); 
     my_media_fail = new Media(srcFail, onSuccess, onError); 
     // my_media_fail.setVolume('1.0'); 
     // if (failCounter >= 35) { 
     //  alert("fail count " + failCounter + " total counting " + (successCounter + failCounter)); 
     // } 

     // Play audio 
     my_media_fail.play(); 
    } catch (err) { 
     alert(err); 
    } 
} 

// Pause audio 
function pauseAudio() { 
    if (my_media) { 
     my_media.pause(); 
    } 
} 

// Stop audio 
function stopAudio(my_media) { 
    if (my_media) { 
     my_media.stop(); 
    } 
    // clearInterval(mediaTimer); 
    // mediaTimer = null; 
} 

// onSuccess Callback 
// 
function onSuccess() { 
    // alert('success'); 
} 

// onError Callback 
function onError(error) { 
    switch(error.code){ 
     case MediaError.MEDIA_ERR_ABORTED: 
     alert('MEDIA_ERR_ABORTED code: ' + error.code); 
     break; 
     case MediaError.MEDIA_ERR_NETWORK: 
     alert('MEDIA_ERR_NETWORK code: ' + error.code); 
     break; 
     case MediaError.MEDIA_ERR_DECODE: 
     alert('MEDIA_ERR_DECODE code: ' + error.code); 
     break; 
     case MediaError.MEDIA_ERR_NONE_SUPPORTED: 
     alert('MEDIA_ERR_NONE_SUPPORTED code: ' + error.code); 
     break; 
     default: 
     { 
      alert('Un Known: ' + error.code); 
      navigator.notification.vibrate(1000); 
      setTimeout(function() { 
       playAudioFail(); 
      }, delayInMilliseconds); 
     } 
    } 
} 

function setAudioPosition(position) { 
    document.getElementById('audio_position').innerHTML = position; 
} 

很多嘗試和錯誤和警告在這裏和那裏後!

1)我避免了getElementById來獲取src路徑,我將它定義爲全局變量。

2)I分離成功的方法和失敗(重構)

3)I取得的變量本地儘可能避免任何內存泄漏和重疊和超過堆等東西。

4)我刪除了setAudioPosition方法,因爲它沒有被使用和調用沒有理由。

(吸取教訓)當你從互聯網上獲取你的代碼時,應該仔細考慮你真正需要的東西。

5)我注意到當我將它的工作提醒,但是當我把他們趕走它沒有工作,所以我

主要解決在關鍵加入震動首先被調用,該劇方法之間Timeout部分這樣

navigator.notification.vibrate(1000); 
      setTimeout(function() { 
       playAudioFail(); 
      }, delayInMilliseconds); 

6)我加放法,但

(leasson學會)知道wher e把它放在 之前,所以我在把它自己放在正確引用相同變量的課程之前就把它放在它之前。

if (my_media_fail != null) { 
      my_media_fail.release(); 
     } 

7)最後意見,它的JavaScript,你可以使用try和catch以防萬一)) Try catch W3School