【问题标题】:MediaPlayer stops playing the sounds - AndroidMediaPlayer 停止播放声音 - Android
【发布时间】:2014-05-14 21:13:57
【问题描述】:

这是一个简单的钢琴应用程序,它可以工作,但有一个问题。大约点击 20 次后(有时正好是 28 次点击),即使我点击了按钮,它也不会播放任何声音。该应用程序不会崩溃或不会警告我任何事情。什么都不是。没有声音。你有什么想法吗?

package com.example.playaudio;

import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;


    public class MainActivity extends Activity implements OnClickListener{
        private MediaPlayer mp;
        private MediaPlayer mp2;
        private MediaPlayer mp3;
        private MediaPlayer mp4;
        private MediaPlayer mp5;
        private MediaPlayer mp6;
        private MediaPlayer mp7;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            setVolumeControlStream(AudioManager.STREAM_MUSIC);
            Button button1=(Button)findViewById(R.id.button_1);
            Button button2=(Button)findViewById(R.id.button_2);
            Button button3=(Button)findViewById(R.id.button_3);
            Button button4=(Button)findViewById(R.id.button_4);
            Button button5=(Button)findViewById(R.id.button_5);
            Button button6=(Button)findViewById(R.id.button_6);
            Button button7=(Button)findViewById(R.id.button_7);

            button1.setOnClickListener(this);
            button2.setOnClickListener(this);
            button3.setOnClickListener(this);
            button4.setOnClickListener(this);
            button5.setOnClickListener(this);
            button6.setOnClickListener(this);
            button7.setOnClickListener(this);

        }

        public void onClick(View v) {
            int resId;
            int resId2;
            int resId3;
            int resId4;
            int resId5;
            int resId6;
            int resId7;


            switch (v.getId()) {
            case R.id.button_1:
                resId = R.raw.a;
                mp = MediaPlayer.create(this, resId);

                mp.start();
                break;
            case R.id.button_2:
                resId2 = R.raw.b;
                mp2 = MediaPlayer.create(this, resId2);
                mp2.start();
                break;
            case R.id.button_3:
                resId3 = R.raw.c;
                mp3 = MediaPlayer.create(this, resId3);
                mp3.start();
                break;
            case R.id.button_4:
                resId4 = R.raw.d;
                mp4 = MediaPlayer.create(this, resId4);
                mp4.start();
                break;
            case R.id.button_5:
                resId5 = R.raw.e;
                mp5 = MediaPlayer.create(this, resId5);
                mp5.start();
                break;
            case R.id.button_6:
                resId6 = R.raw.f;
                mp6 = MediaPlayer.create(this, resId6);
                mp6.start();
                break;
            case R.id.button_7:
                resId7 = R.raw.p;
                mp7 = MediaPlayer.create(this, resId7);
                mp7.start();
                break;

            }


        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.activity_main, menu);
            return true;
        }



    }

【问题讨论】:

  • 问题解决了。在 mp = MediaPlayer ... if(mp!=null) { mp.release(); 之前添加发布方法} mp = MediaPlayer.create(this, resId); mp.start();

标签: android audio media playback


【解决方案1】:

看起来您正在创建一个新的 MediaPlayer 实例来播放每个声音。您应该重复使用它们或清理它们。

来自documentation of the MediaPlayer.create() 方法:

为给定资源 ID 创建 MediaPlayer 的便捷方法。在 成功,prepare() 已经被调用并且不能被调用 再次调用。

使用完 MediaPlayer 后,您应该调用 release() 来释放 资源。 如果不释放,会导致过多的 MediaPlayer 实例 在一个例外。

【讨论】:

  • 是的,我意识到并尝试了这一点,它奏效了。我打算编辑我​​关于真实版本的问题,因为你的回答是正确的,我接受了它。谢谢你的关心:)
  • 但是只有在声音播放完毕后我才能调用release?当然我不能打电话给.start(),然后马上.release()
  • @Zapnologica 您可以设置listener,以便在播放完成时收到通知。
【解决方案2】:

简单的方法是添加 onComplationListener

mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
    @Override
    public void onCompletion(MediaPlayer p1) {
        p1.release();
    }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 2013-01-19
    • 1970-01-01
    相关资源
    最近更新 更多