2012-08-22 36 views
0

我正在使用媒体播放器播放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(); 

在此先感谢。

回答

2

你必须让从创建方法的结果,并使用媒体播放器,因为创建函数会返回媒体播放器之前,检查结果如果成功创建对象,并且如果创建媒体播放器失败,则返回NULL。

check the description of that function in official site

a MediaPlayer object, or null if creation failed

还有一件事你不用叫准备()函数,因为On successfully created MediaPlayer , prepare() will already have been called and must not be called again.

可以查看到MP为空或不是调用mp.start

if(mp!=null) 
    mp.start(); 
+0

如何做到这一点先生?你可以给我几行代码来理解这一点。 –

+1

谢谢,先生,现在正在工作。 –

+0

也看看这个描述http://developer.android.com/guide/topics/media/mediaplayer.html#preparingasync – rajpara

1

根据MediaPlayer状态图,您必须在mp.start()之前拨打mp.prepare()

enter image description here

0

试试;

mp = MediaPlayer.create(MainActivity.this, R.raw.sound); 
if(mp!=null) { 
    mp.start(); 
} 
+0

仍然显示同样的问题先生。现在例外是在这个line:mp.prepare(); –

0

这可能不是问题,但你应该改变这样的:

if (theText.equals(" hello"){ 
    mp = MediaPlayer.create(MainActivity.this, R.raw.sound); 
    mp.prepare(); 
    mp.start();} 
+0

对不起,先生,但问题仍然是一样的。 –

+0

顺便说一句,你的文件夹中的文件sound.mp3? –

+0

是先生。它存在于res/raw文件夹中。 –