2011-10-02 45 views
1

我的代码有什么问题?我有一个切换按钮,我想播放/停止一个MP3。我猜的代码应该如下:在Android问题上使用MediaPlayer类播放MP3

package com.android.iFocus; 


import android.app.Activity; 
import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.ToggleButton; 

public class iFocusActivity extends Activity implements OnClickListener { 
    public int count; 
    MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.rain); 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     ToggleButton toggleRain = (ToggleButton)findViewById(R.id.toggleRain); 

     //Define Listeners 
     toggleRain.setOnClickListener(this); 

     count = 0; 


    } 


    @Override  
    public void onClick(View toggleRain) { 


     if(count==0){ 

      mediaPlayer.start(); 
      count=1; 
     } else { 
      //MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.rain); 
        mediaPlayer.pause(); 
      mediaPlayer.stop(); 
        mediaPlayer.release(); 
      count=0; 
     } 

    } 

} 

的问题是:Eclipse不给任何错误,但在仿真器/手机它给了我一个异常和模具立即开始后。这里有云:

10-02 20:28:24.312: INFO/ActivityManager(59): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.android.iFocus/.iFocusActivity } 
10-02 20:28:24.392: DEBUG/AndroidRuntime(960): Shutting down VM 
10-02 20:28:24.402: DEBUG/dalvikvm(960): Debugger has detached; object registry had 1 entries 
10-02 20:28:24.462: INFO/ActivityManager(59): Start proc com.android.iFocus for activity com.android.iFocus/.iFocusActivity: pid=967 uid=10036 gids={} 
10-02 20:28:24.502: INFO/AndroidRuntime(960): NOTE: attach of thread 'Binder Thread #3' failed 
10-02 20:28:25.822: DEBUG/AndroidRuntime(967): Shutting down VM 
10-02 20:28:25.822: WARN/dalvikvm(967): threadid=1: thread exiting with uncaught exception (group=0x4001d800) 
10-02 20:28:25.932: ERROR/AndroidRuntime(967): FATAL EXCEPTION: main 
10-02 20:28:25.932: ERROR/AndroidRuntime(967): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.android.iFocus/com.android.iFocus.iFocusActivity}: java.lang.NullPointerException 

好吧,当我初始化的onClick内部类中的MediaPlayer,它并没有给我任何错误,并且aplication不给我开始这首歌的任何错误。但它不应该停止。所以,当我点击toggleButton时,它会启动,当我再次单击时,它不会执行任何操作,但会在日志猫上给我一个错误:

第一次按下切换按钮并且歌曲开始正常时出错错误):

10-02 20:39:02.712: INFO/ActivityManager(59): Start proc com.android.iFocus for activity com.android.iFocus/.iFocusActivity: pid=996 uid=10036 gids={} 
10-02 20:39:02.782: INFO/AndroidRuntime(989): NOTE: attach of thread 'Binder Thread #3' failed 
10-02 20:39:04.432: INFO/ActivityManager(59): Displayed activity com.android.iFocus/.iFocusActivity: 1804 ms (total 640049 ms) 
10-02 20:39:08.672: DEBUG/AudioSink(34): bufferCount (4) is too small and increased to 12 
10-02 20:39:08.982: WARN/AudioFlinger(34): write blocked for 73 msecs, 2105 delayed writes, thread 0xb3b8 
10-02 20:39:09.682: DEBUG/dalvikvm(437): GC_EXPLICIT freed 686 objects/38192 bytes in 216ms 
10-02 20:39:14.502: WARN/AudioFlinger(34): write blocked for 86 msecs, 2110 delayed writes, thread 0xb3b8 
10-02 20:39:14.642: DEBUG/dalvikvm(188): GC_EXPLICIT freed 164 objects/11408 bytes in 176ms 
10-02 20:39:19.622: DEBUG/dalvikvm(261): GC_EXPLICIT freed 43 objects/1912 bytes in 154ms 
10-02 20:39:20.352: WARN/AudioFlinger(34): write blocked for 78 msecs, 2119 delayed writes, thread 0xb3b8 

错误,当我再次按下切换按钮和歌曲应该停止:

10-02 20:43:22.412: ERROR/MediaPlayer(1032): pause called in state 8 
10-02 20:43:22.412: ERROR/MediaPlayer(1032): error (-38, 0) 
10-02 20:43:22.412: ERROR/MediaPlayer(1032): stop called in state 0 
10-02 20:43:22.412: ERROR/MediaPlayer(1032): error (-38, 0) 
10-02 20:43:22.612: WARN/MediaPlayer(1032): mediaplayer went away with unhandled events 
10-02 20:43:22.612: WARN/MediaPlayer(1032): mediaplayer went away with unhandled events 
10-02 20:43:22.622: WARN/MediaPlayer(1032): mediaplayer went away with unhandled events 
10-02 20:43:22.622: WARN/MediaPlayer(1032): mediaplayer went away with unhandled events 

回答

4

第一件事,第一,我的分析:1。 你没有初始化里面的onCreate在MediaPlayer():

MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.rain); 

'这个' < ---这个东西是NULL,因此你运行时出现NullPointerException,首先加载应用程序时间。
2.在第二点击按钮,你叫

mediaPlayer.release(); 

而且您下一次单击,在异常状态的MediaPlayer

好了,解决方法是非常简单的,你需要考虑的最佳实践在Android上编程:

package pete.android.study; 

import android.app.Activity; 
import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.ToggleButton; 

public class Main extends Activity implements OnClickListener { 
     // declare controls 
     public int count = 0; 
     MediaPlayer mediaPlayer = null; 
     ToggleButton toggleRain = null; 
     /* 
     * (non-Javadoc) 
     * @see android.app.Activity#onCreate(android.os.Bundle) 
     */ 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      // load layout 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 
      // load controls 
      toggleRain = (ToggleButton)findViewById(R.id.toggleRain); 
      // init player 
      mediaPlayer = MediaPlayer.create(this, R.raw.rain); 
      // set click event handler 
      toggleRain.setOnClickListener(this); 
      // init state for playing 
      count = 0; 
     } 

     /* 
     * (non-Javadoc) 
     * @see android.view.View.OnClickListener#onClick(android.view.View) 
     */ 
     @Override  
     public void onClick(View toggleRain) { 
      if(count == 0){ 
       mediaPlayer.start(); 
       count = 1; 
      } else { 
       mediaPlayer.pause();     
       count = 0; 
      } 
     } 

     /* 
     * (non-Javadoc) 
     * @see android.app.Activity#onDestroy() 
     */ 
     @Override 
     protected void onDestroy() { 
      if(mediaPlayer != null) { 
       mediaPlayer.stop(); 
       mediaPlayer.release(); 
       mediaPlayer = null; 
      } 
     } 

} 

当然,它的作品像魅力^^! 有很多方法来改善这个简单的应用程序,但是,我想你可以通过查看Android开发人员的参考文档找到:)​​

+0

工作就像一个魅力!我做了一个改进,这是在保护无效onDestroy(){}添加super.onDestroy()(原因是在后面的按钮“关闭”之前崩溃)。我会继续改善这一点,这是我的第一个应用程序。:) – Pabluez

0

您是否尝试过移动初始化里面的onCreate的,而不是只在类体内?这将是最好的地方。

如果您在onClick中进行初始化,则预期会显示您显示的错误。这是因为每次点击时都会创建一个新的MediaPlayer实例。

+0

是的,我做过这个,但编译器说,无法解析onPlayer中的mediaPlayer对象()。我想我应该让mediaPlayer成为全球的(因为eclipse说本地媒体播放器没有被使用,那么,尝试了很多东西,比如把mediaPlayer这个词作为onClick的参数(但是eclipse在这个标记之后说“VariableDeclaratorId”)。 – Pabluez

0

你的问题是这里的release()声明:

if(count==0){ 
    mediaPlayer.start(); 
    count = 1; 
} else { 
    //MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.rain); 
    mediaPlayer.pause(); 
    mediaPlayer.stop(); 
    mediaPlayer.release(); 
    count = 0; 
} 

有你可以改变这一点,取决于你想要的结果了几个不同的方式。如果您只想播放/暂停,如您所说,那么您只需要删除stop()release()来电。特别是release()。该调用会将音频资源释放回系统,这意味着您需要将其恢复到准备好的状态,然后才能再次使用它。

我强烈建议阅读this reference document非常彻底。 MediaPlayer类相当复杂,当状态管理不当时,很容易出现这种错误。

相关问题