【问题标题】:android - MediaPlayer does not play when public staticandroid - 公共静态时 MediaPlayer 不播放
【发布时间】:2013-09-12 22:06:57
【问题描述】:

我看过很多其他关于此的帖子,但我无法使其正常工作。我只是想使用 MediaPlayer 播放一首简单的歌曲。这不是 UI 的按钮问题,因为我可以验证按钮方法 startMusic 和 stopMusic 是否被调用。

player.play();而 player.stop() 什么也不做。

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.*;
import android.media.MediaPlayer;


public class MainActivity extends Activity
{
    private static MediaPlayer player = new MediaPlayer();
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        player.create(MainActivity.this,R.raw.sadsadsad);
    }

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


    public void changeLabel(View view)
    {
        TextView myTextView = (TextView) findViewById(R.id.myTextView);
        myTextView.setText("Label changed");
    }

    public void playMusic(View view)
    {
        player.start();
    }

    public void stopMusic(View view)
    {
        player.stop();
    }
}

再次,播放和停止按钮起作用,断点位于 .start() 和 .stop()。

【问题讨论】:

  • 我很困惑。你的标题说你的MediaPlayer 没有播放,但你的帖子正文说它可以播放???哪些方法行不通?
  • 我只是想澄清一下。我使用按钮调用 playMusic 和 stopMusic 方法,但 player.start() 和 player.stop() 什么都不做。很抱歉造成混乱。
  • 为什么是player static?如果您删除 static 修饰符,我认为它应该可以工作
  • 我在这里的其他地方读到 MediaPlayers 需要是私有静态的。我是 Android 新手。
  • 不行,去掉修饰符看看会发生什么

标签: java android android-mediaplayer


【解决方案1】:

来自关于停止播放器并且它不再播放的评论。 当媒体播放器停止时,您需要再次准备()它。 如果您想停止媒体播放器而不必再次准备,我会建议

public void stopMusic(View view)
{
    if(player != null && player.isPlaying())
    {
        player.pause();
        player.seekTo(0);
    }
}

如果您查看状态列表here,您应该知道发生了什么。 此外,您正在使用来自实例(播放器)而不是类(MediaPlayer)的静态方法(create(..))

编辑:

如你所愿。使用 MediaPlayer.create(...) 是正确的方法,如果您使用像 eclipse 这样的 IDE,它会警告您,由于 MediaPlayer.create 是一个静态方法,它应该从类 (MediaPlayer) 中使用,而不是创建的实例。我不确定如果通过实例完成是否会导致问题,但我遵循所有警告都是错误的理念,因此我尝试遵守标准编码约定以防万一。

【讨论】:

  • 谢谢。您能否详细解释一下使用 MediaPlayer 而不是我的实例中的 create()?
  • pause/seekTo 解决方案是否适用于您的停止/播放问题?
  • 确实如此。两个答案都是正确的,因为 codeMagic 首先回答了我要检查他,并支持你的。再次感谢。
【解决方案2】:

不确定这是否可行,因为我对MediaPlayer 没有太多经验,但对于评论来说太多了。还是试试吧

MediaPlayer player;
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    player = MediaPlayer.create(MainActivity.this,R.raw.sadsadsad);
}

编辑

尝试移动

player = MediaPlayer.create(MainActivity.this,R.raw.sadsadsad);

onCreate()playMusic()

 public void playMusic(View view)
{
    player = MediaPlayer.create(MainActivity.this,R.raw.sadsadsad);
    player.start();
}

我还认为您应该在stopMusic() 中致电player.release()。在这里可能无关紧要,但我相信它会是安全的。

【讨论】:

  • 嘿,这行得通,但由于某种原因,它只能工作一次。如果我第一次点击播放,它会播放,然后如果我点击停止,它就会停止。但是,如果我再做一次,它什么也不做。有任何想法吗?并感谢您的帮助。
  • 您是否遇到异常,崩溃?或者只是第二次什么都不做?我马上就走,可能还需要一些时间才能回来,但我会检查你是否有答案
  • 没有崩溃,只是第二次似乎什么也没做。再次感谢
  • @Siriss 我已经编辑了我的答案。我还没有机会测试它,但尝试一下,看看它是否有效。
  • 确实有效。感谢所有的帮助。两种解决方案都解决了我的问题。
猜你喜欢
  • 2017-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多