[英]play an mp3 with MediaPlayer class on Android issues
我的代码出了什么问题? 我有一个切换按钮,我想播放/停止一个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时,它不会给我任何错误,并且应用程序不会给我任何启动歌曲的错误。 但它并没有停止。 因此,当我点击toggleButton时,它会启动,当我再次点击时,它没有做任何事情,但在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
当我再次按下toggleButton并且歌曲应该停止时出错:
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
首先,我的分析:1。你没有在onCreate()中初始化MediaPlayer:
MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.rain);
'this'<---这个东西是NULL,所以你在运行时有一个NullPointerException,首先加载应用程序时间。
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开发人员的参考文档来查找:)
您是否尝试过在onCreate内部而不是在类体内部进行初始化? 这将是最好的地方。
如果在onClick内部初始化,则会显示您显示的错误。 这是因为每次单击时都会创建一个新的MediaPlayer实例。
你的问题在于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()
。 该调用将音频资源释放回系统,这意味着您需要先将其恢复到准备状态,然后才能再次使用它。
我强烈建议非常彻底地阅读此参考文档 。 MediaPlayer类相当复杂,当状态管理不当时,这样的错误很容易出现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.