我正在使用媒体播放器播放mp3文件。但是当我运行它时,我得到空指针异常。请告诉我这是什么问题。
这是代码:
package com.example.soundplayer;
import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
/**
* Variables
*/
MediaPlayer mp = null;
String hello = "Hello!";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**
* Talking with the buttonHello
*/
final Button buttonHello = (Button) findViewById(R.id.idHello);
buttonHello.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
managerOfSound(hello);
} // END onClick()
}); // END buttonHello
} // END onCreate()
/**
* Manager of Sounds
*/
protected void managerOfSound(String theText) {
if (mp != null) {
mp.reset();
mp.release();
}
if (theText == hello){
mp = new MediaPlayer();
mp = MediaPlayer.create(MainActivity.this, R.raw.sound);
mp.start();}
}
}
这是一个例外:
08-22 13:13:01.001: W/dalvikvm(785): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
08-22 13:13:01.001: E/AndroidRuntime(785): Uncaught handler: thread main exiting due to uncaught exception
08-22 13:13:01.020: E/AndroidRuntime(785): java.lang.NullPointerException
08-22 13:13:01.020: E/AndroidRuntime(785): at com.example.soundplayer.MainActivity.managerOfSound(MainActivity.java:57)
08-22 13:13:01.020: E/AndroidRuntime(785): at com.example.soundplayer.MainActivity$1.onClick(MainActivity.java:30)
08-22 13:13:01.020: E/AndroidRuntime(785): at android.view.View.performClick(View.java:2364)
08-22 13:13:01.020: E/AndroidRuntime(785): at android.view.View.onTouchEvent(View.java:4179)
08-22 13:13:01.020: E/AndroidRuntime(785): at android.widget.TextView.onTouchEvent(TextView.java:6541)
08-22 13:13:01.020: E/AndroidRuntime(785): at android.view.View.dispatchTouchEvent(View.java:3709)
08-22 13:13:01.020: E/AndroidRuntime(785): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
08-22 13:13:01.020: E/AndroidRuntime(785): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
08-22 13:13:01.020: E/AndroidRuntime(785): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
08-22 13:13:01.020: E/AndroidRuntime(785): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
08-22 13:13:01.020: E/AndroidRuntime(785): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659)
08-22 13:13:01.020: E/AndroidRuntime(785): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
08-22 13:13:01.020: E/AndroidRuntime(785): at android.app.Activity.dispatchTouchEvent(Activity.java:2061)
08-22 13:13:01.020: E/AndroidRuntime(785): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643)
08-22 13:13:01.020: E/AndroidRuntime(785): at android.view.ViewRoot.handleMessage(ViewRoot.java:1691)
08-22 13:13:01.020: E/AndroidRuntime(785): at android.os.Handler.dispatchMessage(Handler.java:99)
08-22 13:13:01.020: E/AndroidRuntime(785): at android.os.Looper.loop(Looper.java:123)
08-22 13:13:01.020: E/AndroidRuntime(785): at android.app.ActivityThread.main(ActivityThread.java:4363)
08-22 13:13:01.020: E/AndroidRuntime(785): at java.lang.reflect.Method.invokeNative(Native Method)
08-22 13:13:01.020: E/AndroidRuntime(785): at java.lang.reflect.Method.invoke(Method.java:521)
08-22 13:13:01.020: E/AndroidRuntime(785): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
08-22 13:13:01.020: E/AndroidRuntime(785): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
08-22 13:13:01.020: E/AndroidRuntime(785): at dalvik.system.NativeStart.main(Native Method)
我在这一行得到例外:
mp.start();
提前致谢。
答案 0 :(得分:2)
您必须从create方法获取结果并在使用该mediaPlayer之前检查该结果,因为如果成功创建,create function将返回媒体播放器对象,如果无法创建媒体播放器,则返回NULL。
check the description of that function in official site
<强> a MediaPlayer object, or null if creation failed
强>
还有一件事您不需要调用prepare()函数,因为On successfully created MediaPlayer , prepare() will already have been called and must not be called again.
你可以在调用mp.start
之前检查mp是否为nullif(mp!=null)
mp.start();
答案 1 :(得分:1)
根据MediaPlayer状态图,您必须在mp.prepare()
之前致电mp.start()
。
答案 2 :(得分:0)
尝试;
mp = MediaPlayer.create(MainActivity.this, R.raw.sound);
if(mp!=null) {
mp.start();
}
答案 3 :(得分:0)
这可能不是问题,但你应该改变这个:
if (theText.equals(" hello"){
mp = MediaPlayer.create(MainActivity.this, R.raw.sound);
mp.prepare();
mp.start();}