2013-04-30 2 views
0

В моей деятельности есть таймер, который каждую секунду отправляет сообщение обработчику, который меняет изображение.Таймер прерывания MediaPlayer

Каждый раз, когда пользователь нажимает на изображение звук воспроизводится в функции onClickListner деятельности, используя этот код:

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

На XPERIA дуги (Android 4.0.4) звук не воспроизводился полностью, и как только таймер запускает его. Если отключить таймер, проблем нет.

На 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; 
    } 
} 

Решение -------------------------------------

I переместил объявление MediaPlayer в класс и устранил проблему.

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

Я не знаю, почему предыдущий код работает с 2.2, но не 4. в любом случае он сработал.

ответ

1

С его короткого звука в вашей игре я бы порекомендовал звуковой пул. Клипы 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

+0

yes soundpools mp3 mp3 Я только что обновил свой ответ. – j2emanue

Смежные вопросы