Ошибка воспроизведения файла: NullPointerException в Android - PullRequest
0 голосов
/ 02 августа 2011

Я хочу воспроизвести mp3-файл на Android, но я получаю эту ошибку:

java.lang.NullPointerException at HelloAndroid.playMusic

Мой код ниже

package com.bestvalue.hello;
/*import android.util.Log;*/
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.media.MediaPlayer;
import android.net.Uri;

public class HelloAndroid extends Activity {

    public static final String DebugTag = "LogInfo";
    public MediaPlayer mp;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TextView tv = new TextView(this);        
        tv.setText("keke napep");
        playMusic();
        setContentView(tv);        
        Log.i(DebugTag, "Info about my app na");                
    }


    public void playMusic () {
        try {
            Uri fileName = Uri.parse("http://www.perlgurl.org/podcast/archives/podcasts/PerlgurlPromo.mp3");
            mp= MediaPlayer.create(this, fileName);
            mp.start();
        } catch (Exception e){
            Log.e(DebugTag, "Error Playing File", e);
        }
    }

    @Override
    protected void onStop() {
        if (mp != null) {
            mp.stop();
            mp.release();
        }
        super.onStop();
    }
}

Что я буду делать, чтобы исправить эту ошибку?

Спасибо

ОБНОВЛЕНИЕ

package com.bestvalue.hello;
/*import android.util.Log;*/
import android.app.Activity;
//import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.media.AudioManager;
import android.media.MediaPlayer;


public class HelloAndroid extends Activity {

    public static final String DebugTag = "LogInfo";
    private MediaPlayer mp = new MediaPlayer();

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TextView tv = new TextView(this);        
        tv.setText("keke napep");
        playMusic();
        setContentView(tv);                           
    }

    public void playMusic () {
        try {
            String url = "http://www.perlgurl.org/podcast/archives/podcasts/PerlgurlPromo.mp3";
            mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mp.setDataSource(url);
            mp.prepare(); 
            mp.start();         
        } catch (Exception e){
            Log.e(DebugTag, "Error Playing File", e);
        }
    }

    @Override
    protected void onStop() {
        if (mp != null) {
            mp.stop();
            mp.release();
        }
        super.onStop();
    }
}

После реализации некоторых ответов я получаю эту ошибку: java.io.IOException: Prepare Failed .: status = 0x1

Ответы [ 2 ]

1 голос
/ 02 августа 2011

добавить mp.prepare(); перед mp.start ();

0 голосов
/ 02 августа 2011

Ваша проблема в том, что вы не проверяете mp, прежде чем вызывать методы для него.Согласно документации , если MediaPlayer.create не удастся, он вернет null.

Правило большого пальца с NullPointerException s: вернитесь и проверьте свои возвращения.Что-то обычно возвращает null, когда вы этого не ожидаете, и вы пытаетесь вызвать метод для него.В этом случае вы ничего не звоните на fileName, так что это безопасно.Вы звоните по номеру mp, так что это, вероятно, то, что вас заставляет.

[править]

Почему звук не воспроизводится:

Вы не 'Вызов setAudioStreamType(AudioManager.STREAM_MUSIC); и использование URI при создании экземпляра MediaPlayer предназначены только для локально хранимых носителей.Для сетевых носителей необходимо установить его местоположение, позвонив setDataSource(context, uri);.

С (очень хорошая) документация :

Uri myUri = ....; // initialize Uri here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(getApplicationContext(), myUri);
mediaPlayer.prepare();
mediaPlayer.start();`
...