【问题标题】:play an mp3 with MediaPlayer class on Android issues在 Android 问题上使用 MediaPlayer 类播放 mp3
【发布时间】:2014-08-31 01:12:03
【问题描述】:

我的代码有什么问题?我有一个切换按钮,我想播放/停止 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 时,它不会给我任何错误,并且应用程序不会给我任何启动歌曲的错误。但它并没有停止。因此,当我单击切换按钮时,它会启动,当我再次单击时,它什么也没做,只是在 log cat 上给我一个错误:

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

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

【问题讨论】:

    标签: java android android-mediaplayer


    【解决方案1】:

    首先,我的分析: 1.你没有在onCreate()里面初始化MediaPlayer:

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

    'this' 2。在第二次单击按钮时,您调用了

    mediaPlayer.release();
    

    下次点击时,MediaPlayer State 出现异常

    好吧,修复非常简单,您需要考虑 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 开发者参考文档找到答案:)

    【讨论】:

    • 工作就像一个魅力!我只做了一项改进,即在受保护的 void onDestroy(){} 上添加 super.onDestroy() (原因是在使用后退按钮“关闭”之前崩溃)。我会继续改进这个,这实际上是我的第一个应用程序。 :)
    【解决方案2】:

    您是否尝试过将初始化移动到 onCreate 内部,而不是仅仅移动到类主体内部?这将是最好的地方。

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

    【讨论】:

    • 是的,我确实尝试过,但编译器说无法解析 onClick() 中的 mediaPlayer 对象。我想我应该让 mediaPlayer 全局化(因为 eclipse 说本地 mediaPlayer 没有被使用。好吧,尝试了很多事情,比如将 mediaPlayer 这个词作为 onClick 的参数(但是 eclipse 在这个令牌之后说“VariableDeclaratorId”)。我怎么能这样做?
    【解决方案3】:

    您的问题在于此处的 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 类相当复杂,当没有正确管理状态时,很容易出现这样的错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-25
      • 1970-01-01
      • 2015-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-27
      • 2013-03-24
      相关资源
      最近更新 更多