Android MediaPlayer 执行中的 IllegalStateException

IllegalStateException in Android MediaPlayer execution

我正在尝试 运行 连续发出蜂鸣声,直到用户按下按钮。我将 alarm.mp3 文件添加到 raw folder。但是这个媒体文件没有执行。我得到 IllegalStateException

这是我的代码:

MediaPlayer mp = new MediaPlayer();
try{
            mp.release();
            mp = MediaPlayer.create(this,R.raw.alarm);

            mp.prepare();
            mp.setVolume(1f, 1f);
            mp.setLooping(true);
            mp.start(); 

        }catch(IllegalStateException e){
            System.out.println("Test Exception "+e);

        }catch (IOException e) {
            // TODO: handle exception
            System.out.println("Test Exception "+e);
        }

我将该 mp3 文件添加到 asset folder 并尝试播放它,但我仍然遇到同样的异常。

这是我使用的代码:

MediaPlayer mp = new MediaPlayer();
try{
                mp.release();
                AssetFileDescriptor afd=context.getAssets().openFd("alarm.mp3s");   
                mp.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
                mp.prepare();
                mp.setVolume(1f, 1f);
                mp.setLooping(true);
                mp.start(); 

            }catch(IllegalStateException e){
                System.out.println("Test Exception "+e);

            }catch (IOException e) {
                // TODO: handle exception
                System.out.println("Test Exception "+e);
            }

如有任何帮助,我们将不胜感激。如果您需要更多信息,请告诉我。

更新:

try{
                mp = MediaPlayer.create(context,R.raw.alarm);
                mp.setVolume(1f, 1f);
                mp.setLooping(true);
                mp.start(); 

            }catch(IllegalStateException e){
                System.out.println("Test Exception "+e);

            }

当用户点击按钮时:

mp.stop();
         if(!mp.isPlaying()){
              mp.release();
         }

这是例外情况:

10-04 12:50:06.105: I/System.out(14074): Test Exception java.lang.IllegalStateException

没有看到堆栈跟踪,这只是一个假设。但是你是直接调用

mp.release();

就在您创建一个之后。第二个是您正在创建 mediaPlayernew MediaPlayer() ANDcreate()。如果你使用 create()mp.create() 方法,你不需要 new MediaPlayer(),你不需要调用 prepare()。我会这样尝试:

  mp = MediaPlayer.create(this,R.raw.alarm);            
  mp.setVolume(1f, 1f);
  mp.setLooping(true);
  mp.start(); 

如果 mediaPlayer 完成,只需调用 release。如API中所述,在release()之后,MediaPlayer处于结束状态:

Once the MediaPlayer object is in the End state, it can no longer be used and there is no way to bring it back to any other state.

您应该遵循 API,我知道要阅读的内容很多,但了解有关 MediaPlayer 的所有内容非常重要。