【问题标题】:Media player playing multiple files at the same time媒体播放器同时播放多个文件
【发布时间】:2013-08-22 22:02:43
【问题描述】:

我遇到的问题是,一旦用户单击要从我的 ListView 播放的声音,然后在播放该声音时,他们单击另一个声音,他们单击的 2 个声音同时播放。

我想要当前正在播放的声音,完成,然后开始他们最近点击的新声音。

如果有人可以帮助我,那将不胜感激!

代码:

ListView BoardList = (ListView) findViewById(R.id.BoardList);

    String List[] = {

     "Audio1", "Audio2", "Audio3", "Audio4", "Audio5"
         , "Audio6", "Audio7", "Audio8", "Audio9"
           , "Audio10", "Audio11", "Audio12" };

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            R.layout.listcustomize, R.id.textItem, List);

    BoardList.setAdapter(adapter);

    BoardList.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            MediaPlayer mPlayer = null;
            if (position == 0) {



                mPlayer = MediaPlayer.create(HodgeMain.this,
                        R.raw.Audio1);
                mPlayer.start();
            }

            if (position == 1) {


                mPlayer = MediaPlayer.create(HodgeMain.this,
                        R.raw.Audio2);
                mPlayer.start();

            }
            if (position == 2) {


                mPlayer = MediaPlayer.create(HodgeMain.this, R.raw.Audio3);
                mPlayer.start();

            }
            if (position == 3) {


                mPlayer = MediaPlayer.create(HodgeMain.this,
                        R.raw.Audio4);
                mPlayer.start();
            }
            if (position == 4) {


                mPlayer = MediaPlayer.create(HodgeMain.this,
                        R.raw.Audio5);
                mPlayer.start();
            }
            if (position == 5) {


                mPlayer = MediaPlayer.create(HodgeMain.this,
                        R.raw.Audio6);
                mPlayer.start();
            }
            if (position == 6) {


                mPlayer = MediaPlayer.create(HodgeMain.this,
                        R.raw.Audio7);
                mPlayer.start();
            }

            if (position == 7) {


                mPlayer = MediaPlayer
                        .create(HodgeMain.this, R.raw.Audio8);
                mPlayer.start();
            }
            if (position == 8) {


                mPlayer = MediaPlayer.create(HodgeMain.this,
                        R.raw.Audio9);
                mPlayer.start();
            }
            if (position == 9) {


                mPlayer = MediaPlayer.create(HodgeMain.this,
                        R.raw.Audio10);
                mPlayer.start();
            }
            if (position == 10) {


                mPlayer = MediaPlayer.create(HodgeMain.this,
                        R.raw.Audio11);
                mPlayer.start();
            }
            if (position == 11) {

                mPlayer = MediaPlayer.create(HodgeMain.this,
                        R.raw.Audio12);
                mPlayer.start();

            }

【问题讨论】:

  • 不请自来的建议 => 这通常表明当您一遍又一遍地重复相同的事情时,可以更有效地编写代码。

标签: android media-player


【解决方案1】:
Media player playing multiple files at the same time

试试

声明MediaPlayer mPlayer; 对所有人通用

喜欢

BoardList.setAdapter(adapter);
MediaPlayer mPlayer;

然后使用mPlayer.release();

if (position == 0) {

    if(mPlayer!=null)
    {
        mPlayer.release();
        mPlayer=null;
    }

    mPlayer = MediaPlayer.create(HodgeMain.this,
            R.raw.Audio1);
    mPlayer.start();

}
.
.
.
.
if(position==N)
{
        if(mPlayer!=null)
        {
            mPlayer.release();
            mPlayer=null;
        }
        mPlayer = MediaPlayer.create(HodgeMain.this,
                R.raw.AudioN);
        mPlayer.start();
}

关于release():

Releases resources 与此 MediaPlayer object 关联。

使用完MediaPlayer 后调用此方法被认为是一种很好的做法。

特别是,每当有Activity of an application is paused (its onPause() method is called), or stopped (its onStop() method is called),这个方法就应该是invoked to release the MediaPlayer object,除非应用程序有特殊需要保留对象。

PS。我已经尝试过 release() 工作正常!

示例:这对我有用

try {

if (position == 1) {
    if (mPlayer != null) {
        mPlayer.release();
        mPlayer = null;
    }
    mPlayer = MediaPlayer.create(MainActivity.this, R.raw.all);
    mPlayer.start();
}
if (position == 2) {
    if (mPlayer != null) {
        mPlayer.release();
        mPlayer = null;
    }
    mPlayer = MediaPlayer.create(MainActivity.this, R.raw.all2);
    mPlayer.start();
}
}

catch (Exception e) {
    // TODO: handle exception
    e.printStackTrace();
}

【讨论】:

  • 当我在“mPlayer.start”之前添加该代码时,它并不能解决问题。
  • @Jack 尝试更新答案!
  • 我已经在我的答案中更新了我的代码,这样你就可以看到我是否正确地完成了所有操作。出于某种原因,音频文件仍在相互播放。
  • @Jack 用对我来说很好的例子检查我的更新答案!
  • 我用谷歌搜索了这个错误,人们说忽略它。无论如何,感谢您的帮助和时间。祝你有美好的一天:)
【解决方案2】:

在开始之前,请考虑执行以下操作:

if(mPlayer.isPlaying()) mPlayer.stop();
mPlayer.start();

在您的 if 语句中实现它,看看它是否适合您!

但要使其工作,您必须在更广泛的范围内定义您的 MediaPlayer 对象,而不是每次都声明一个新的 MediaPlayer 对象。

【讨论】:

  • 由于某种原因,当我这样做时应用程序崩溃了。
  • 发布你的堆栈跟踪然后看看它为什么崩溃!
【解决方案3】:

如前所述,您需要使用new 实例化MediaPlayer 类,以便在您的类中的任何位置访问其对象,而不是像现在这样静态访问。我很确定查阅此文档将帮助您更多地了解MediaPlayerhttp://developer.android.com/reference/android/media/MediaPlayer.html

【讨论】:

    【解决方案4】:

    问题在于静态方法 MediaPlayer.create();实际上是为您返回一个新的 MediaPlayer 实例。

    多个播放的原因是因为您没有停止先前播放的音频文件(如其他人建议的那样)。

    在调用 MediaPlayer.create() 之前立即调用此方法:

    private void killSounds(){
        try{
            mPlayer.stop();
            mPlayer.release();
        }
        catch(Exception e) {
            //Eat it and do nothing because it's just going to be an NPE when mPlayer is null, which doesn't matter because we're handling it
        }
    }
    

    在您停止之前的 MediaPlayer 后,您应该能够创建新的,而不会出现声音重叠。

    【讨论】:

    • 当我使用它时,它们仍然相互重叠。另外,我必须删除“private void killSounds(){”,因为它会引发错误。
    • 如果您在这方面遇到错误,那么您的代码完全有其他问题。您正在以静态方法运行所有这些,不是吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多