2013-04-30 63 views
0

在我的活動中,有一個定時器每秒發送一條消息給一個處理程序,它會改變圖像。只要定時器中斷MediaPlayer

MediaPlayer.create(this, R.raw.voice).start(); 

在一個XPERIA弧(4.0.4的Android)的聲音不完全播放和:

每次用戶點擊的聲音被使用此代碼在活動的onClickListner功能發揮的圖像計時器觸發它停止。如果我禁用了計時器,那就沒有問題了。

在HTC Legend(Android 2.2)上沒有問題。聲音完全播放。

我找不出這個問題。

public class ActivityTest extends Activity implements View.OnClickListener, ViewSwitcher.ViewFactory 
{ 

    ImageSwitcher switcher; 

    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.test_listen); 

     switcher = (ImageSwitcher) findViewById(R.id.imageSwitcher); 
     switcher.setFactory(this); 
     switcher.setOnClickListener(this); 

     final Handler handler = new Handler() 
     { 
      @Override 
      public void handleMessage(Message msg) 
      { 
       switcher.setImageDrawable(getResources().getDrawable(R.drawable.image)); 
       // if this line is commented it works fine 
      } 
     }; 

     new Timer().scheduleAtFixedRate(new TimerTask() { 
      @Override 
      public void run() 
      { 
       handler.sendEmptyMessage(0); 
      } 
     }, 0, 1000); 
    } 

    @Override 
    public void onClick(View view) 
    { 
     MediaPlayer.create(this, R.raw.voice).start(); 
    } 


    @Override 
    public View makeView() 
    { 
     ImageView image = new ImageView(this); 
     image.setScaleType(ImageView.ScaleType.FIT_CENTER); 
     image.setLayoutParams(new ImageSwitcher.LayoutParams(ImageSwitcher.LayoutParams.FILL_PARENT, ImageSwitcher.LayoutParams.FILL_PARENT)); 
     return image; 
    } 
} 

解決方案-------------------------------------

我將MediaPlayer的聲明移到了課堂上,並解決了問題。

MediaPlayer mp; 
    @Override 
    public void onClick(View view) 
    { 
     mp =MediaPlayer.create(this, R.raw.voice); 
     mp.start(); 
    } 

我不知道爲什麼以前的代碼工作在2.2但不是4.無論如何它的工作。

回答

1

因爲它的短暫聲音你玩我建議一個soundpool。 Soundpool剪輯保存在內存中以便快速訪問,因爲它們很小。我假設你演奏的聲音很短。在的onCreate這樣做是爲了預載:

// Load the sound 
    soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0); 
soundID= soundPool.load(this, R.raw.voice, 1); 

    soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() { 
     @Override 
     public void onLoadComplete(SoundPool soundPool, int sampleId, 
       int status) { 
      loaded = true; 
     } 
    }); 

然後在onclick方法(當用戶點擊圖片)這樣做:

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) { 
       soundPool.play(soundID, volume, volume, 1, 0, 1f); 
} 

其中的Soundpool聲明爲實例變量私有的Soundpool的Soundpool什麼類似。嘗試一下,讓我知道發生了什麼。

+0

SoundPool不播放任何內容。這是mp3。 Soundpool支持mp3嗎?它在播放時返回0。 – Ali 2013-04-30 20:36:08

+0

是soundpools播放mp3的我剛剛更新了我的答案。 – j2emanue 2013-04-30 21:28:45