Android Media Player返回NullPointerException

时间:2013-12-25 09:13:48

标签: java android exception nullpointerexception

我知道周围有类似的问题,但所有答案都是针对这些应用程序的。我得到一个nullpointerexception但无法理解这个问题。这是一个非常长的活动课程,所以我无法分享。对不起,如果这不是一个明确的问题,但我需要的是一些提示或想法,我怎样才能找到这个例外的原因。的 logcat的:

12-25 10:54:31.845: E/MediaPlayer(14465): error (1, -2147483648)
12-25 10:54:31.865: E/AndroidRuntime(14465): FATAL EXCEPTION: main
12-25 10:54:31.865: E/AndroidRuntime(14465): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.sametenekeci.vmail/com.st.vmail.MainActivity}: java.lang.NullPointerException
12-25 10:54:31.865: E/AndroidRuntime(14465):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2079)
12-25 10:54:31.865: E/AndroidRuntime(14465):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2104)
12-25 10:54:31.865: E/AndroidRuntime(14465):    at android.app.ActivityThread.access$600(ActivityThread.java:132)
12-25 10:54:31.865: E/AndroidRuntime(14465):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1157)
12-25 10:54:31.865: E/AndroidRuntime(14465):    at android.os.Handler.dispatchMessage(Handler.java:99)
12-25 10:54:31.865: E/AndroidRuntime(14465):    at android.os.Looper.loop(Looper.java:137)
12-25 10:54:31.865: E/AndroidRuntime(14465):    at android.app.ActivityThread.main(ActivityThread.java:4575)
12-25 10:54:31.865: E/AndroidRuntime(14465):    at java.lang.reflect.Method.invokeNative(Native Method)
12-25 10:54:31.865: E/AndroidRuntime(14465):    at java.lang.reflect.Method.invoke(Method.java:511)
12-25 10:54:31.865: E/AndroidRuntime(14465):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
12-25 10:54:31.865: E/AndroidRuntime(14465):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
12-25 10:54:31.865: E/AndroidRuntime(14465):    at dalvik.system.NativeStart.main(Native Method)
12-25 10:54:31.865: E/AndroidRuntime(14465): Caused by: java.lang.NullPointerException
12-25 10:54:31.865: E/AndroidRuntime(14465):    at com.sametenekeci.vmail.MainActivity.onCreate(MainActivity.java:90)
12-25 10:54:31.865: E/AndroidRuntime(14465):    at android.app.Activity.performCreate(Activity.java:4465)
12-25 10:54:31.865: E/AndroidRuntime(14465):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
12-25 10:54:31.865: E/AndroidRuntime(14465):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2033)
12-25 10:54:31.865: E/AndroidRuntime(14465):    ... 11 more

感谢您的帮助。

此外: MAINACTIVITY IS HERE

5 个答案:

答案 0 :(得分:2)

改变它:

mp.setOnCompletionListener(new OnCompletionListener() {

            @Override
            public void onCompletion(MediaPlayer mp) {
                // TODO Auto-generated method stub
                // Rest of Code
            }
        });

答案 1 :(得分:2)

您的行号90会导致nullpointer异常,

line number 90: mp.setOnCompletionListener(new OnCompletionListener() {

nullPointerException的原因是,你还没有初始化媒体播放器第一: //首先初始化它

MediaPlayer mp= new MediaPlayer();

然后 按照你的意愿使用它,就像这样:

mp= new MediaPlayer();
mp = MediaPlayer.create(this, R.raw.entermail);
    mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

答案 2 :(得分:2)

MediaPlayer是一个状态机 - 如果你以错误的顺序调用它的'方法,你会遇到问题。初始化玩家还有两种方法:

  1. 使用create()方法 - 在我们的例子中:

    mp = MediaPlayer.create(this, R.raw.entermail);
    
  2. 此行将使用作为参数传递的资源声音初始化您的播放器。如果成功,则已经调用prepare(),不得再次调用。

    你在这一行收到错误:

    mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
    

    表示mp为null。在设置listener:

    之前检查create()的结果
    if (mp != null) {
        mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        // rest of the code
    }
    else {
        Log.d("AUDIO", "MediaPlayer.create() failed. mp is null");
        // deal with it accordingly
    }
    

    在您的情况下,请检查您在create()中使用的文件,并确保(form the Docs)

      

    在这种情况下,“原始”资源是系统不会尝试以任何特定方式解析的文件。但是,此资源的内容不应该是原始音频。它应该是一种支持格式的正确编码和格式化的媒体文件。

    1. 您可以使用构造函数创建MediaPlayer对象:

      mp = new MediaPlayer();
      
    2. 然后记得设置数据源并准备:

          mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
          mediaPlayer.setDataSource(getApplicationContext(), myUri);
          mediaPlayer.prepare();
      
          //when ready
          mediaPlayer.start();
      

      请记住在setDataSource上捕获异常。还记得在完成后调用MediaPlayer对象上的release()。

      顺便说一下,在设置了监听器后,调用setAppState(),然后调用:

      mp.reset();
      mp.setDataSource();
      mp.prepare();
      mp.start();
      

      所以你不妨用第二种方法初始化你的播放器,并设置OnErrorListener以检查是否有任何错误。

      The guide还建议在单独的线程上调用任何长操作(例如prepare()),以阻止UI线程。请仔细阅读指南,了解状态,它将帮助您了解正在发生的事情。

答案 3 :(得分:1)

我知道为什么(也许:)) 在方法 setAppState()中,你在try catch块中调用 mp.prepare(),然后你在外面调用 mp.start()抓住。 mp.prepare()可能会导致异常。

在try catch块中调用 mp.start(); 以确保mp已成功准备。

try {
    mp.prepare();
    mp.start();
} catch (IllegalStateException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

答案 4 :(得分:1)

您好,您可以通过添加<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> in your manifest

来解决您的问题