在Android应用程序中使用MediaPlayer的正确方法

时间:2013-02-22 20:23:29

标签: android android-mediaplayer

对不起我的英语,但我来自巴西,我使用谷歌翻译。

好吧,我在这个应用程序中苦苦挣扎,我试图制作一个流媒体在线广播,在2.2版中工作正常,但4.0版不起作用。没有错误发生,根本不起作用。以下是我的代码。

我感谢任何帮助。

package com.radiomiriam;
import java.io.IOException;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;

public class Main extends Activity {
public String url = "http://69.64.48.96:9880";
public MediaPlayer player = new MediaPlayer();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    play();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

public void stop(){
    Toast.makeText(getApplicationContext(), "Finalizando...", Toast.LENGTH_SHORT).show();
    if(player.isPlaying()){
        player.stop();
    }
}

public void play(){
    if(player.isPlaying()){
        Toast.makeText(getApplicationContext(), "Já está em execução!", Toast.LENGTH_SHORT).show();
    } else {
        Toast.makeText(getApplicationContext(), "Preparando...", Toast.LENGTH_SHORT).show();
        player.setAudioStreamType(AudioManager.STREAM_MUSIC);
        player.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);
        try {
            player.setDataSource(url);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            player.prepare();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        player.start();
    }
}

public void onClick(View v) {
    final int id = v.getId();
    switch (id) {
    case R.id.btnPlay:
        play();
        break;
    case R.id.btnStop:
        stop();
        break;
    }
}
}

您好,请原谅我的坚持,但我仍然没有找到问题的解决方案而且不知道如何解决,我再次请求您的帮助来解决这个问题。

应用程序在2.x和3.x版本中运行,但在版本4.x中运行。下面是一个下载项目的链接,你可以看看并帮助我。

http://nsi.inf.br/RadioMiriam.rar(已移除)

4 个答案:

答案 0 :(得分:7)

我下载了你的项目,它实际上返回错误代码: E / MediaPlayer(1976):错误(-38,0)

这是在准备好之前启动媒体播放器引起的。

我做了一些改动,但它开始起作用了。你应该:

  1. 在MediaPlayer上设置onPrepared监听器(即在onCreate中)

    player.setOnPreparedListener(new OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            mp.start();
        }
    });
    
  2. 从play()方法中删除player.start()

  3. 以这种方式设置数据源(在你的play()方法中)

    player.setDataSource(this, Uri.parse("http://69.64.48.96:9880/"));
    
  4. 适用于我的HTC Sensation with Android 4.0.3

    如果您需要任何帮助,请告诉我。

    编辑:我忘了,我也删除了

    player.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);
    

    多余

答案 1 :(得分:2)

prepare()调用可能阻止了UI线程(当你这样做时,android 4.0讨厌它)

你需要在asynctask这样的后台线程中完成这项工作。这是一个实现AsyncTask的匿名版本,可以在后台运行play()

public void onClick(View v) {
    final int id = v.getId();
    switch (id) {
    case R.id.btnPlay:
        new AsyncTask<Void, Void, Void>(){
            @Override
            protected Void doInBackground(Void... voids) {
                play();
                return null;
            }
        }.execute();
        break;
    case R.id.btnStop:
        stop();
        break;
    }
}

您需要阅读一些关于MediaPlayer's states(播放,准备,停止等)的内容,以了解调用prepare会阻止UI线程的原因(

了解AsyncTasks

的更多信息

答案 2 :(得分:0)

您尚未在.xml文件中的按钮与代码之间设置任何链接。即使您按下按钮,也永远不会调用onClick方法。

将onCreate方法替换为:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button playButton = (Button) findViewById(R.id.btnPlay);
    playButton.setOnClickListener(this);
    Button stopButton = (Button) findViewById(R.id.btnStop);
    stopButton.setOnClickListener(this);
    play();
}

答案 3 :(得分:0)

在后台线程上做任何 IO 工作总是更好。

这包括MediaPlayer。但在MediaPlayer案例中,您已经有prepareAsync()方法在后台为您准备MediaPlayer。

这样做的好方法是:

package com.radiomiriam;
import java.io.IOException;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;

public class Main extends Activity  implements OnPreparedListener{
public String url = "http://69.64.48.96:9880";
public MediaPlayer player = new MediaPlayer();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    play();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

public void stop(){
    Toast.makeText(getApplicationContext(), "Finalizando...", Toast.LENGTH_SHORT).show();
    if(player.isPlaying()){
        player.stop();
    }
}

public void play(){
    if(player.isPlaying()){
        Toast.makeText(getApplicationContext(), "J? est? em execuç?o!", Toast.LENGTH_SHORT).show();
    } else {
        Toast.makeText(getApplicationContext(), "Preparando...", Toast.LENGTH_SHORT).show();
        player.setAudioStreamType(AudioManager.STREAM_MUSIC);
        player.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);
        try {
            player.setDataSource(url);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            player.setOnPreparedListener(this);
            player.prepareAsync();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        }
    }
}
@Override
public void onPrepared(MediaPlayer mp) {
    // TODO Auto-generated method stub
    mp.start();
}
public void onClick(View v) {
    final int id = v.getId();
    switch (id) {
    case R.id.btnPlay:
        play();
        break;
    case R.id.btnStop:
        stop();
        break;
    }
}
}

阅读文档总是一个好习惯,所以这里有一个指向MediaPlayer API的链接:MediaPlayer