【问题标题】:Android MediaPlayer won't start playing audioAndroid MediaPlayer 不会开始播放音频
【发布时间】:2020-12-02 23:48:30
【问题描述】:

我有一个非常简单的 Android 应用程序,应用程序一打开,音频文件就会开始播放。

但音频根本不播放,我在 Logcat 中收到此警告:MediaPlayer finalized without being released

MainActivity.java:

public class MainActivity extends AppCompatActivity {

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

        MediaPlayer mPlayer = MediaPlayer.create(this, R.raw.song);

        mPlayer.start();
    }
}

我使用 MediaPlayer.create() 方法初始化了 MediaPlayer,因此我不必准备或释放 mPlayer。

我不确定这是我的代码有问题还是只是 android 模拟器的声音输出问题。

更新: 我试图在 onCreate() 方法之外声明 MediaPlayer,并在 onCreate() 中对其进行初始化。现在我没有收到警告,但它仍然不播放音频。

更新 MainActivity.java:

public class MainActivity extends AppCompatActivity {

    MediaPlayer mPlayer;

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

        mPlayer = MediaPlayer.create(this, R.raw.song);

        mPlayer.start();
    }
}

更新 2: 我在我的应用程序中添加了 3 个回调,onPreparedListener、onErrorListener 和 onCompletionListener。

更新 MainActivity.java

public class MainActivity extends AppCompatActivity {

    MediaPlayer mPlayer;

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

        mPlayer = MediaPlayer.create(this, R.raw.song);

        mPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
            @Override
            public boolean onError(MediaPlayer mp, int what, int extra) {
                Log.e("Error", "onError: " + what);
                return false;
            }
        });

        mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                Log.i("Completion", "onCompletion: Completed");
            }
        });

        mPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                Log.i("Prepared", "onPrepared: Prepared MediaPlayer");
            }
        });

        mPlayer.start();
    }
}

我几乎在应用程序启动后就获得了准备好的日志,并且在等待音频文件的持续时间后获得了完整的日志。我没有收到任何错误日志。

【问题讨论】:

  • 您的MediaPlayer 实例是onCreate() 的本地实例,因此它几乎会立即发布。尝试使实例成为您的 MainActivity 类的成员。
  • 我尝试在 onCreate() 方法之外声明它并在 onCreate() 中初始化它,现在我没有收到警告但它仍然不播放音频。
  • 你能发布你更新的代码吗?
  • 感谢您的建议。我添加了回调并更新了代码。我确实从 onPreparedListener 和 onCompletionListener 获得了日志,但音频仍然无法播放。
  • 非常感谢!!我想到了。当我的无线耳机没电时,我切换到有线耳机,当我再次运行应用程序时播放音频。在模拟器上使用蓝牙似乎有问题。

标签: java android android-studio android-mediaplayer


【解决方案1】:

首先你必须声明MediaPlayer的类,

MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.create(this, R.raw.song);
mediaPlayer.prepare();
mediaPlayer.start();

我希望这段代码能够正常工作并对阅读这篇文章的每个人都有帮助

【讨论】:

  • 如果你能发布一个类似于李逸轩的完整示例可能会更有用,因为这里有一些问题,比如对象生命周期,从上下文之外的 sn-p 中不清楚像那样。另外,如果您还没有,您可以尝试编译和测试您的代码,因为我认为它可能存在一些问题。 (无论如何,李逸轩的更新代码对我有用,所以我认为问题可能出在其他地方。)
  • 用全局变量mediaPlayer声明MediaPlayer类,所以再次调用onCreate里面的变量mediaPlayer。这个变量必须在 onCreate mediaPlayer = new MediaPlayer(); mediaPlayer.create(this, R.raw.song); mediaPlayer.prepare(); mediaPlayer.start();
  • 我认为这仍然可能是错误的,如果处理得当,播放器不需要是全局/静态/等。无论如何,您可以编辑您的帖子并添加一个完整的示例。这会让人们更容易自己尝试。
猜你喜欢
  • 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
相关资源
最近更新 更多