首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何阻止Mediaplayer

如何阻止Mediaplayer
EN

Stack Overflow用户
提问于 2020-03-21 12:41:03
回答 2查看 49关注 0票数 1

我有三个音调。我正在调用playmusic()函数来在imageview切换上播放其中的两个音调。当我第一次点击图像视图时,tone1就开始播放了。当我点击第二次在相同的图像视图tone2开始播放,但tone1没有停止。

我的要求是,当我点击图像视图-(第一次- tone1应该开始播放)。(第二次- tone1应该停止播放,tone2应该开始播放)(第三次- tone2应该停止播放,tone1应该重新开始播放)等等。

代码语言:javascript
复制
 String file=null;
 int x=0;
    public void playMusic(int i) {
        x=i;
        if(i==1){
            file = R.raw.tone1;
        }else if(i==2){
            file = R.raw.tone2;
        }else{
            file = R.raw.tone3;
        }
        mediaPlayer = new MediaPlayer();
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        AssetFileDescriptor assetFileDescriptor = 
        Main2Activity.this.getResources().openRawResourceFd(file);
        if(assetFileDescriptor == null) return;
        try {
            mediaPlayer.setDataSource(
                    assetFileDescriptor.getFileDescriptor(),
                    assetFileDescriptor.getStartOffset(),
                    assetFileDescriptor.getLength()
            );
            assetFileDescriptor.close();

            mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mediaPlayer) {
                    if(mediaPlayer != null){
                        mediaPlayer.release();
                        mediaPlayer = null;
                    }
                }
            });

            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(final MediaPlayer mediaPlayer) {
                    mediaPlayer.start();
                }
            });
            mediaPlayer.prepareAsync();

        } catch (IllegalArgumentException e) {
//                            HelpFunctions.showLog("ERROR = " + e);
        } catch (IllegalStateException e) {
//                            HelpFunctions.showLog("ERROR = " + e);
        } catch (IOException e) {
//                            HelpFunctions.showLog("ERROR = " + e);
        }
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-21 16:06:28

我对您的逻辑做了一个小小的修改,并添加了mediaplayer.reset()。以下是链接的解决方案

代码语言:javascript
复制
public class MainActivity extends AppCompatActivity {

   @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      final ImageView player = findViewById(R.id.play);
      player.setOnClickListener(new View.OnClickListener() {
            @Override public void onClick(View v) {
             playMusic(1);
         }
       });

      mediaPlayer = new MediaPlayer();
    }

    int file = 0;
    MediaPlayer mediaPlayer;

    int x = 0;

    public void playMusic(int i) {
     x = x + i;
     if (x == 1) {
     file = R.raw.tone1;
   } 
    else if (x == 2) {
    file = R.raw.tone2;
   } else {
    x = 0;
    file = R.raw.tone3;
    }
mediaPlayer.reset();

mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
AssetFileDescriptor assetFileDescriptor =
    MainActivity.this.getResources().openRawResourceFd(file);
if (assetFileDescriptor == null) return;
try {
  mediaPlayer.setDataSource(
      assetFileDescriptor.getFileDescriptor(),
      assetFileDescriptor.getStartOffset(),
      assetFileDescriptor.getLength()
  );
  assetFileDescriptor.close();

  mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
    @Override
    public void onCompletion(MediaPlayer mediaPlayer) {
      if (mediaPlayer != null) {
        mediaPlayer.release();
      }
    }
  });

  mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener()      {
    @Override
    public void onPrepared(final MediaPlayer mediaPlayer) {
      mediaPlayer.start();
    }
  });
  mediaPlayer.prepareAsync();
    } catch (IllegalArgumentException e) {
  //                            HelpFunctions.showLog("ERROR = " + e);
   } catch (IllegalStateException e) {
  //                            HelpFunctions.showLog("ERROR = " + e);
} catch (IOException e) {
  //                            HelpFunctions.showLog("ERROR = " + e);
    }
  }
}
票数 0
EN

Stack Overflow用户

发布于 2020-03-21 15:30:18

当我点击第二次在相同的图像视图tone2开始播放,但tone1没有停止。

如果这是唯一的问题,请尝试在调用mediaPlayer = new MediaPlayer();之前放置以下行

if (mediaPlayer != null && mediaPlayer.isPlaying()) mediaPlayer.stop();

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60787887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档