【问题标题】:Android Studio- Media Player doesn't play sound On Genymotion?Android Studio-媒体播放器在 Genymotion 上不播放声音?
【发布时间】:2016-10-12 13:02:17
【问题描述】:

我正在尝试构建一个小应用程序,当我们单击按钮时它会播放声音。但我无法播放声音。不知道是什么问题。请帮助我。下面是代码。

 public class MainActivity extends AppCompatActivity {

    private Button button;
    private MediaPlayer mediaPlayer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mediaPlayer = new MediaPlayer();
        mediaPlayer = MediaPlayer.create(getApplicationContext(),R.raw.song);


        button = (Button)findViewById(R.id.mediaButtonId);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

              mediaPlayer.start();

            }
        });
    }

}

注意:-对不起,伙计们,我认为问题出在我的代码上,但应用程序在我的手机上运行得非常好,所以这是我的 genymotion 模拟器的问题。谁能建议我解决这个问题。通过顺便说一句,我使用的是 Mac OSX。

【问题讨论】:

    标签: android android-studio


    【解决方案1】:

    MediaPlayer 有自己的生命周期。您不能只是创建实例然后开始播放。首先你必须准备它然后玩它。

    您可以同步或异步准备媒体播放器。

    类似的东西:

    MediaPlayer mediaPlayer= new MediaPlayer();
    mediaPlayer=MediaPlayer.create(getApplicationContext(),R.raw.song);
    
    mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mediaPlayer) {
       mediaPlayer.start();
    }
    });
    mediaPlayer.prepareAsync();
    

    或者,如果你想同步进行

        MediaPlayer mediaPlayer= new MediaPlayer();
        mediaPlayer=MediaPlayer.create(getApplicationContext(),R.raw.song);
        try {
            mediaPlayer.prepare();
        } catch (IOException e){
    
        }
        mediaPlayer.start();
    

    请确保在玩之前做好准备。

    媒体播放器生命周期:https://developer.android.com/reference/android/media/MediaPlayer.html

    【讨论】:

    • 我已经尝试过了,但我得到了非法状态例外
    • 在stackTrace中,它在prepare()调用所在的行显示“由IllegalStateException引起”。我参考了一些网站。有人说多次 prepare() 调用会导致此异常。
    • 你是吗?多次调用prepare()?设置数据源后,您应该只调用一次。或直接使用您使用的 create 便捷方法创建它。
    • mediaPlayer=new MediaPlayer(); mediaPlayer=MediaPlayer.create(getApplicationContext(),R.raw.song);尝试 { mediaPlayer.prepare(); } catch (IOException e) { e.printStackTrace(); } button=(Button)findViewById(R.id.mediaButtonId); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mediaPlayer.start(); } });
    • stackoverflow.com/a/6061704/4215176...In 这个有人说不需要准备方法
    【解决方案2】:

    您需要确保媒体播放器已准备就绪,然后才能播放,因此您设置 onPreparedListener 为您处理此问题,如下所示:

    MediaPlayer mp = new MediaPlayer();
    
    mp = MediaPlayer.create(getApplicationContext(),R.raw.song);
    
    mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mediaPlayer) {
            mp.start();
        }
    });
    
    button = (Button)findViewById(R.id.mediaButtonId);
    
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
          mp.prepareAsync();
        }
    });
    

    从您按下按钮到以这种方式播放声音会有一点延迟。另一种方法是在媒体播放器准备好之前禁用按钮,然后在按钮的 onclick 中,您可以在启用按钮时调用mp.start();

    【讨论】:

    • 抱歉没有工作。我认为问题出在我的模拟器上。我正在使用 genymotion。当我使用 isPlaying() 方法时,它显示为 true,这意味着代码运行良好。但我不是能听到声音
    • 在真实设备上测试@SaiSankalp
    • 是的,谢谢我已经在我的手机上测试了它的工作正常。但我无法理解我的模拟器有什么问题@MichealStoddart
    猜你喜欢
    • 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
    相关资源
    最近更新 更多