【问题标题】:App with media Player forces down带有媒体播放器的应用程序强制关闭
【发布时间】:2012-09-29 17:37:19
【问题描述】:
case R.id.btn7:
    if (mp != null && mp.isPlaying()) mp.stop();
    mp = MediaPlayer.create(a.this, R.raw.aaaa);
    mp.start();
    break;
case R.id.btn8:
    if (mp != null && mp.isPlaying()) mp.stop();
    mp = MediaPlayer.create(a.this, R.raw.bbbb);
    mp.start();
    break;

如何使用 setDataSource 来停止我的应用程序以强制关闭?请帮忙! 如果我这样使用它,eclipse 会将 setDataSource 突出显示为红色;

public void onClick(View v) {
    switch(v.getId()) {
        case R.id.btn:
            if (mp != null && mp.isPlaying()) mp.stop();
            mp.setDataSource(zoo.this,R.raw.gata);
            mp.prepare();
            mp.start();
            break;

【问题讨论】:

  • 我正在为每个按钮创建一个新的 mp(总共 16 btns)。我怎样才能只用一个 mp 运行我的应用程序?
  • App forces down suddently的可能重复
  • kcoppock 先生,请问您对这个问题有什么答案吗?这不是同一个话题

标签: java android


【解决方案1】:

好的,所以我实际上一直在为我一直在做的一个爱好项目做类似的事情。在阅读了 MediaPlayer 文档一段时间后,这是我想出的方法(请注意,这是为了一次只播放一个声音):

首先,我创建了一个重写的 Application 类来保存我的全局变量——在这个实例中,我的单个 MediaPlayer 对象:

public class GlobalVars extends Application {
    private static MediaPlayer mp = new MediaPlayer();

    public static MediaPlayer getMediaPlayer() {
        return mp;
    }
}

一旦应用程序启动,这将创建一个 MediaPlayer 实例。它也是静态的,因此无需实例化类即可使用。

现在,在我的主类中(特别是在我的 onClick 方法中),我检索该实例,重置它,设置我的数据源,准备播放,然后启动它:

MediaPlayer mp = GlobalVars.getMediaPlayer();

//note that in my case, item is an object of mine that 
//contains an AssetFileDescriptor, which you can get by
//calling getAssets().openFd("filename.mp3");
AssetFileDescriptor afd = item.getDescriptor();

mp.reset();
//leaving out the try/catch block for conciseness
mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
mp.prepare();
mp.start();

【讨论】:

  • 能否请您更具体地评论您的评论//请注意在我的...("filename.mp3");
  • 案例 R.id.btn: MediaPlayer mp = GlobalVars.getMediaPlayer(); AssetFileDescriptor afd = getAssets().openFd(R.raw.gata);mp.reset(); mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());mp.prepare();mp.start();休息;
  • AssetFileDescriptor afd = getResources().openRawResourceFd(R.raw.gata);
  • 这对我的原始文件来说是更好的方法吗?
  • 是的,如果您使用的是 Raw 文件夹,我想应该可以。在我的,我的音频存储在资产下的文件夹中。请注意,您可能无法从单击处理程序中调用 getResources()。您可以将其声明为类变量,然后在 onCreate 中对其进行初始化(例如,private Resource res; 作为类变量,res = getResources(); 在 onCreate 中)。然后在您的点击处理程序中,您可以调用 res.openRawResourceFd(R.raw.gata);
【解决方案2】:

如果你没有限制,你可以使用声音管理器。要播放的声音。http://developer.android.com/reference/android/media/AudioManager.html

【讨论】:

  • 我创建的方法返回一个 nullPointer 异常..你能更具体一点吗?
  • 你的意思是这样的吗:
  • 字符串 url = "R.raw.aaaa";媒体播放器 mp = 新媒体播放器();试试 { mp.setDataSource(url); mp.setAudioStreamType(AudioManager.STREAM_MUSIC); mp.prepare(); mp.start();
  • 或者如果我移动资产文件夹中的 mp3 文件:
  • case R.id.btn: String path = "/assets/aaaa.mp3";尝试 { mp.setDataSource(path); mp.setAudioStreamType(AudioManager.STREAM_MUSIC); mp.prepare(); mp.start(); } catch (Exception e) { Log.i("Exception", "流媒体播放器中的异常 e = " + e); } 休息;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多