E/MediaPlayer:错误(1,-19),E/MediaPlayer:错误(0,-38)

E/MediaPlayer: error (1, -19), E/MediaPlayer: error (0, -38)

我的问题是关于我在处理媒体播放器时不断遇到的一个问题,不仅是音频文件,还有视频文件。当 "play button" 被按下超过约 10 次而不重新启动应用程序时,应用程序将停止并且 LogCat 将显示错误消息 "E/MediaPlayer: error (1, -19)"。

我搜索了 Stack 以及媒体播放器上的 Android 开发人员页面,但无法弄清楚如何解决这个问题。下面的代码似乎让我按下了大约 16 次播放按钮,但仅此而已。这比我尝试过的其他方法要多得多。

此特定代码会播放简短的动物叫声,让我的侄子能够识别。我觉得我在媒体播放器上遗漏了一些东西,但又不能指手画脚。

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/gradient"
    tools:context="com.curiousca.griddemo.MainActivity"> 
     <GridLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true">

        <Button
            android:id="@+id/bluejay"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/button_draw"
            android:layout_margin="5dp"
            android:layout_column="0"
            android:layout_columnWeight="1"
            android:layout_gravity="fill"
            android:layout_row="0"
            android:layout_rowWeight="1"
            android:onClick="onClick"
            android:text="Bluejay" />
    </GridLayout>
 `

       public void onClick(View view) {

         int id = view.getId();
         String songId = "";

         songId = view.getResources().getResourceEntryName(id);

         int resourceId = getResources().getIdentifier(songId, "raw", getPackageName());

         MediaPlayer mediaPlayer = MediaPlayer.create(this, resourceId);
           if (mediaPlayer != null){
           mediaPlayer.start();
           }


         //Log.i("Click", String.valueOf(view.getId()));
         Log.i("tap", songId);
       }

swooby,

  1. 实例化媒体播放器

    private static MediaPlayer mediaPlayer;
    public static MediaPlayer getMediaPlayer() {
    return mediaPlayer;
    
  2. 最好将代码放在 try/catch 块中以处理发生的任何异常

    try {
    if (btn == firstBird){
      stopPlaying();
      mediaPlayer = MediaPlayer.create(getActivity()
                .getApplicationContext(),R.raw.bird_one);
      mediaPlayer.start();
      mediaPlayer.setLooping(true);
      timerTextView.setText("15:00");
    catch (IllegalStateException e){
        stopPlaying();
    }
    
  3. 创建额外的方法来防止重写代码

  4. "stopPlaying()" 方法有助于停止和释放媒体播放器。 应调用此方法以确保媒体播放器之前没有参与或从另一个 activity、片段或当前 activity/fragment.

    播放
    public void stopPlaying() {
      if (mediaPlayer != null){
        mediaPlayer.stop();
        mediaPlayer.release();
        mediaPlayer = null;
    
  5. 在开始新的 mediaPlayer 实例之前调用 stopPlaying() 方法。参见#2。
  6. 如果您在倒数计时器中循环播放声音,请务必使用类似这样的方法...

    @Override
    public void onFinish() {
       resetTimer();
       stopPlaying();
     }
    
  7. 最后在您的 "stop button" 代码中包含一个 onCompletion() 方法

    if (btn == stopPlay){
            onCompletion(mediaPlayer);
        }
    @Override
    public void onCompletion(MediaPlayer mediaPlayer) {
    if (mediaPlayer != null && mediaPlayer.isPlaying()) {
        mediaPlayer.stop();
        mediaPlayer.release();
    }
    

    这样媒体播放器就会停止并释放以进行下一次操作。