2011-04-04 78 views
1

我触发MediaPlayer在单击按钮时播放声音。有时候,播放器会播放整个声音,有时候不会。它总是在最后切断。我在这里阅读了一些关于人们遇到同样问题的主题,但没有任何建议奏效。例如,有人说添加一个mediaPlayer.onCompletionListener()可以解决这个问题,但它没有。Android MediaPlayer问题

这里是与MediaPlayer的代码:

public View getView(int position, View convertView, ViewGroup parent) { 



    LayoutInflater inflater = getLayoutInflater(); 
    View row = inflater.inflate(R.layout.vocab_row, parent, false); 

    ImageView playIcon = (ImageView) row 
       .findViewById(R.id.blueplay_icon); 
TextView vocabWord = (TextView) row 
     .findViewById(R.id.vocab_text_word); 
TextView vocabMeaning = (TextView) row 
     .findViewById(R.id.vocab_text_meaning); 

vocabWord.setText(data.get(position).getKey()); 
vocabMeaning.setText(data.get(position).getDefinition()); 

final String fileName = "audio/" + data.get(position).getAudio(); 

// set the click listener for the play button 
playIcon.setOnClickListener(new OnClickListener() { 
    public void onClick(View v) { 

     final MediaPlayer player = new MediaPlayer(); 
     AssetManager manager = SingleLesson.this.getAssets(); 
     final AssetFileDescriptor descriptor; 

     try { 

      descriptor = manager.openFd(fileName); 
      long start = descriptor.getStartOffset(); 
      long end = descriptor.getLength(); 

      //reset player 
      if (player != null) { 
       player.reset(); 
      } 

      player.setDataSource(descriptor.getFileDescriptor(), 
        start, end); 

     } catch (IOException e) { 
      Log.e("IO EXCEPTION: ", "while getting mp3 assets."); 
      e.printStackTrace(); 
     } 

     // set volume 
     player.setVolume(100, 100); 

     try { 
      player.prepare(); 
     } catch (IllegalStateException e) { 
      Log.e("ERROR: ", "media player, illegal state"); 
      e.printStackTrace(); 
     } catch (IOException e) { 
      Log.e("ERROR: ", "media player, IO exception"); 
      e.printStackTrace(); 
     } 

     player.setOnPreparedListener(new OnPreparedListener() { 

      @Override 
      public void onPrepared(MediaPlayer inPlayer) { 
       player.start(); 
      } 
     }); 

     // called when the file is finished playing 
     player.setOnCompletionListener(new OnCompletionListener() { 

      @Override 
      public void onCompletion(MediaPlayer player) { 
       player.stop(); 
       player.release(); 
      } 

     }); 
    } 

这个问题是发生在模拟器上,但不是我的HTC不可思议。它也不会发生在我女朋友的moto droid2上,但是这些声音在moto droid2上确实有“点击”的声音。

回答

1

模拟器的年龄?我发现仿真器文件在一段时间后变得腐败。如果它不是新的,请尝试创建一个。

+0

感谢您的回复,但没有解决任何问题。很明显,这确实发生在某些手机上 - 用户通过电子邮件发出投诉,但是我仍然无法在除了模拟器之外的任何内容中再现问题。 – user548956 2011-04-14 22:52:45

+0

嗨bytebender你能解决我的问题http://stackoverflow.com/questions/14544848/some-time-music-does-not-stop-android – 2013-01-27 06:20:46

0

我有几个建议给你。它可能会或可能不会工作。 MediaPlayer.prepare()是一个同步方法,这意味着它将在任何其他代码运行之前完成,因此您不需要onPreparedListener来开始播放。你可以在prepare方法下面输入MediaPlayer.start()。其他建议是,因为你想一遍又一遍地播放声音,你prolly不想发布mediaplayer。尝试将MediaPlayer.reset()方法放在onCompletionListener中。希望它解决了这个问题。您也可以尝试添加MediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);在setDataSource方法之前。

谢谢。