2012-06-29 4 views
3

저는 새로운 활동이 시작될 때 소리 재생을 시작해야하는 앱을 만들고 있습니다. 그래서 저는 mediaplayer를 사용하여 oncreate에서 사운드를 재생했으며 제대로 작동했습니다. 하지만 대신 사운드 풀을 사용하려고 할 때 활동을 생성하고로드하여 재생하려고했습니다. 재생되지 않습니다. mediaplayer보다 음질이 좋은 사운드 풀을 선택했습니다.soundPool을 oncreate()에서 재생할 수 있습니까?

무슨 문제가 될 수 있는가? oncreate에서 일하는 것을 소리 치지 않습니까? 당신은 어디서든 재생할 수 있습니다

+1

u는 oncreate에서 soundpool을 사용할 수 있습니다 ... 그리고 mediaplayer가 큰 파일을 재생한다는 것을 기억하십시오 ... soundpool은 진드기 같은 작은 소리를 재생하는 것입니다 ... – Goofy

+0

"환영합니다"와 같은 작은 소리를 재생하고 있습니다. 버튼을 클릭 할 때 잘 동작합니다.그러나 내가 창조 할 때에도 똑같이 할 때, 그것은 작동하지 않습니다. – Aadi

+0

onCreate에서 사운드 풀을 만들 때 구현을 게시하고 사용 방법을 설명 할 수 있습니다. – Niko

답변

1

,

아픈 onCreateplayFile

private void playFile(){ 
AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE); 
     float actualVolume = (float) audioManager 
       .getStreamVolume(AudioManager.STREAM_MUSIC); 
     float maxVolume = (float) audioManager 
       .getStreamMaxVolume(AudioManager.STREAM_MUSIC); 
     float volume = actualVolume/maxVolume; 
     if (loaded) { 
      mSoundPool.play(soundID, volume, volume, 1, 0, 1f); 
      Log.e("Test", "Played sound"); 
     } 
} 

그리고 간단한 예

initializeSoundPool

private void initializeSoundPool(){ 
     mSoundPool = new SoundPool(2, AudioManager.STREAM_MUSIC, 0); 
     mSoundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() { 
       public void onLoadComplete(SoundPool soundPool, int sampleId, 
         int status) { 
        loaded = true; 
       } 
      }); 
      soundID = mSoundPool.load(this, R.raw.glassbreak, 1);   
     } 

이 그런 방법을 생성하는 방법을 만들기로 보여 그들에게 전화 해. 이케이

private SoundPool mSoundPool; 
    private int soundID; 
    boolean loaded = false; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.spxml); 
     initializeSoundPool(); 
      playFile(); 
    } 

또는 더 나은 onCreate에서 initializeSoundPool를 호출하고 onResume에 playFile를 호출합니다. 또한

+0

onCreate() 외부에서 initializesoundpool() 및 playfile() 메서드를 모두 호출하고 싶습니다. 하지만 소리가 들리려고 할 때. 이걸 좀 도와주세요. –

2

, 당신은 활동이 시작할 때 파일을 재생 OnWindowFocusChanged를 오버라이드 (override) 할 수 ...이 같은

뭔가 ...

public class YourActivity extends Activity { 
    . 
    . 
    . 
    private Handler mHandler; 

    public void onCreate(Bundle savedInstanceState) { 
    . 
    . 
    . 
    this.mHandler = new Handler(); 

    . 
    . 
    . 

    } 



public void onWindowFocusChanged(boolean paramBoolean) 
     { 

if (paramBoolean) 
       { 
      this.mHandler.postDelayed(new Runnable() 
      { 
      public void run() 
      { 

       // Refer to the answer above to create the play function for your soundfile ... 


      YourActivity.this.play("The sound from the sound pool"); 
      } 
      } 
      , 1000L); 
     } 

}

2

은 아마 당신은 단지를 배치해야 onCreate 메소드에서 sleep.

은 가끔 즉시 일어 났을으로 사운드를 재생해야합니다 응용 프로그램을 작성하려고 거의 같은 문제가 없었다. 결국 많은 시행 착오 끝에 로그 출력에 "sample NOT READY"라는 오류가 표시된다는 것을 발견했습니다. 문제는 사운드 파일을로드하는 것이 비동기 적으로 발생하고로드하기 전에 사운드를 재생하려고하면 실패한다는 것입니다.

은 아마도 당신이 setOnLoadCompleteListener이라는 사용할 수있는 메커니즘이 있습니다,하지만 난이 실제로 유용하는 방법의 예를 보려면 아직했습니다. mirroredAbstraction (위의 예제는 광고 된 것처럼 작동 함)에서 보여지는 예제에서 사운드가로드되지 않은 경우 발생하는 모든 상황은 사운드를 재생하지 못한다는 것입니다. 이는 현재 가지고있는 것과 거의 같습니다.

그 예를 든 마술 "고정"경우

문제가 나는 두 방법의 모든 추가 오버 헤드가 기본적으로 재생되기 전에로드 사운드 시간을 줄 호출하기 때문에 그것은 단지 것을 제안했다. 당신은 아마도 간단한 SystemClock.sleep (100)을 사용하여 동일한 결과를 얻었을 것입니다.

은 소리의 크기에 따라 지연을 연장해야 할 수도 있지만, 서로 다른 지연과 실험의 약간은 당신이 필요로 얼마나 당신을 말할 것이다.

+0

죄송합니다. 늦게 회신 드리겠습니다. 귀하의 회신에 +1하십시오. 비동기 스레드에서 사운드 풀을로드하여 문제를 해결했으며 setOnLoadCompleteListener()를 사용하여 모든 사운드 풀이 재생되기 전에로드되는지 확인했습니다. 정보를 공유하면 솔루션을 찾고 있습니다. :) – Aadi

관련 문제