2016-03-04 30 views
1

當我使用條形碼掃描機架時,我實現了一個soundpool單例類,同時繼續掃描,自動關閉應用程序。錯誤是「無法從包中讀取輸入通道文件描述符」。如何在Android中發佈Soundpool

public void successfulAlert() { 
    Logger.d("", "SuccessAlert Start" + Calendar.getInstance().getTimeInMillis()); 
    final int audioID = mSPool.load(Application.getInstance(), R.raw.scan, 1); 
    mSPool.setOnLoadCompleteListener(new OnLoadCompleteListener() { 

     @Override 
     public void onLoadComplete(SoundPool soundPool, int sampleId, int status) { 
      Logger.d("", "SuccessAlert Completed " + Calendar.getInstance().getTimeInMillis()); 
      float volume = (float) mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 
      mSPool.play(audioID, volume, volume, 1, 0, 1f); 
      /// cleanupSound(); 
     } 
    }); 
    Logger.d(TAG, "Possitive Scan Beep "); 
} 

此代碼爲成功alert,我嘗試清理soundpool發佈,聲音聽不到。任何人都可以建議我,在播放聲音後如何釋放soundpool。

public void cleanupSound() { 
    if (mSPool != null) { 
     mSPool.release(); 
     // mSPool=null; 
     // mAudioManager.unloadSoundEffects(); 
     // mInstance=null; 
    } 
} 

回答

1

問題有兩方面: 1)爲什麼我的聲音不能播放? 2)如何正確發佈SoundPool?

對於1 - SoundPool播放是異步的。你在做:「玩然後釋放」,但你需要做「玩,然後等待,直到播放完成,然後釋放」。

對於2 - 由於1,在播放完成之前,您不應該釋放SoundPool。不幸的是,沒有辦法在完成播放時要求SoundPool回調。我已經看到了兩個解決辦法:

  • 如果你知道需要多久打樣品(X毫秒),安排您的release,在未來X毫秒,可能使用postDelayedHandler
  • 確定真正重要的問題是在您的應用程序完成時發佈SoundPool。因此,監視應用程序中的所有出口點,並確保每個SoundPool都已發佈。如果有人在播放聲音時關閉應用程序,可能會突然切斷該效果,但這可能是您的應用程序正在退出時的正確行爲!

注意:要成爲一個真正表現良好的Android公民,您的應用程序只應在第一次獲取並繼續保持音頻焦點時播放聲音。關於這方面的更多信息:https://developer.android.com/guide/topics/media-apps/volume-and-earphones.html