0

我试图连续运行beeb声音,直到用户按下按钮。我添加了alarm.mp3文件到raw folder。但是这个媒体文件没有执行。我得到IllegalStateExceptionAndroid MediaPlayer执行中的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); 
      } 

任何帮助将appriciated。如果您需要更多信息,请告诉我。

UPDATE:

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 
+0

一旦'release()'被调用'MediaPlayer'不能被使用。当您完全使用“MediaPlayer”并且不再需要其资源时调用该方法。 – Onik

+0

记录并发布_full_ stacktrace,而不仅仅是那么短的一行。 – njzk2

回答

1

没有看到堆栈跟踪,it's只是一个假设。但你直接打电话

mp.release(); 

刚刚创建一个。第二个是你正在创建mediaPlayernew MediaPlayer()create()。如果您使用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处于结束状态:

一旦MediaPlayer对象是在最终状态时,它不再能够 使用,并且没有办法把它回任何其他状态。

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

+0

感谢您的支持。我改变了你的建议,但我仍然得到相同的例外。 –

+0

然后请编辑发布的代码,并请发布您的堆栈跟踪并指出错误发生的地方。 – Opiatefuchs

+0

我更新了这个问题。我很难得到整个堆栈跟踪,我正在处理一个大项目并且找不到相关部分。 –