Java 在Android问题上使用MediaPlayer类播放mp3
我的代码有什么问题?我有一个切换按钮,我想播放/停止mp3。我想代码应该如下所示:Java 在Android问题上使用MediaPlayer类播放mp3,java,android,android-mediaplayer,Java,Android,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
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没有给出任何错误,但在emulator/phone上它给了我一个异常,并在启动后立即消失。下面是:
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: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
您是否尝试过将初始化移动到onCreate内部,而不是仅移动到类主体内部?这是最好的地方
如果在onClick内部初始化,则会出现显示的错误。这是因为每次单击时都会创建一个新的MediaPlayer实例。您是否尝试将初始化移动到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类相当复杂,当状态管理不当时,很容易出现这样的错误 您的问题在于这里的
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类相当复杂,当状态管理不当时,很容易出现这样的错误 首先,我的分析: 1.您没有在onCreate()中初始化MediaPlayer:
首先,我的分析: 1.您没有在onCreate()中初始化MediaPlayer:
“this”是的,我确实尝试过,但编译器说无法解析onClick()中的mediaPlayer对象。我想我应该让mediaPlayer成为全局的(因为eclipse说没有使用本地mediaPlayer。好吧,尝试了很多方法,比如将单词mediaPlayer作为onClick的参数(但是eclipse说在这个标记后面应该有“VariableDeclaratorId”)。我该怎么做呢?是的,我试过了,但编译器说无法解析onClick()中的mediaPlayer对象。我想我应该将mediaPlayer设置为全局(因为eclipse说没有使用本地mediaPlayer。嗯,尝试了很多方法,比如将mediaPlayer一词作为onClick的参数(但eclipse说“VariableDeclaratorId”应该在这个令牌之后出现)。我怎么做呢?效果很好!我只做了一个改进,就是在受保护的void onDestroy(){}上添加了super.onDestroy()(原因是在用后退按钮“关闭”之前崩溃)。我会继续改进这个,实际上这是我的第一个应用程序。:)工作起来很有魅力!我只做了一个改进,那就是在受保护的void onDestroy(){}上添加super.onDestroy()(原因是在“关闭”前用后退按钮崩溃)。我会继续改进这个,这实际上是我的第一个应用程序。:)
MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.rain);
mediaPlayer.release();
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;
}
}
}