【问题标题】:Android MediaPlayer error with intent and button带有意图和按钮的Android MediaPlayer错误
【发布时间】:2016-07-27 15:00:33
【问题描述】:

基本上,我的主要活动是通过一个意图调用另一个具有应该播放声音的按钮的活动。

也就是说,在第二个活动中我有这个方法:

public void start_sound(View v) {
    String url = /*"MY_URL"*/;
    try {
        if (mp != null)
        {
            mp.stop();
            mp.release();
            mp = null;
        }
        mp = new MediaPlayer();
        mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mp.setDataSource(url);
        mp.prepare();
        mp.start();
    } catch (Exception e) {}
}

mp 是一个全局变量(所以我可以检查何时正在播放或为空)。

这是我点击按钮时发生的情况:

E/Surface: getSlotFromBufferLocked: unknown buffer: 0xb40d7400
W/ViewRootImpl: Cancelling event due to no window focus: MotionEvent { action=ACTION_CANCEL, actionButton=0, id[0]=0, x[0]=676.58203, y[0]=318.10547, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=866058, downTime=860523, deviceId=0, source=0x1002 }
W/ViewRootImpl: Cancelling event due to no window focus: MotionEvent { action=ACTION_CANCEL, actionButton=0, id[0]=0, x[0]=676.58203, y[0]=318.10547, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=866058, downTime=860523, deviceId=0, source=0x1002 }
W/ViewRootImpl: Cancelling event due to no window focus: MotionEvent { action=ACTION_CANCEL, actionButton=0, id[0]=0, x[0]=676.58203, y[0]=318.10547, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=866058, downTime=860523, deviceId=0, source=0x1002 }
W/ViewRootImpl: Cancelling event due to no window focus: MotionEvent { action=ACTION_CANCEL, actionButton=0, id[0]=0, x[0]=676.58203, y[0]=318.10547, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=866058, downTime=860523, deviceId=0, source=0x1002 }
E/MediaPlayer: error (1, -2147483648)
I/Choreographer: Skipped 1806 frames!  The application may be doing too much work on its main thread.

第一个发生在我根据意图更改活动时;其他的,当我按下声音按钮时。

我已经拥有清单中的权限。

编辑:这是完整的课程:

import android.media.AudioManager;
import android.media.MediaPlayer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

public class activity_2 extends AppCompatActivity {   
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_activity_2);
    }

    public void start_sound(View v) {

        String url = "<MY_URL>";
        MediaPlayer mp = new MediaPlayer();
        try {
            mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mp.setDataSource(url);
            mp.setOnPreparedListener(this);
            mp.prepare();
            mp.start();
        } catch (Exception ignored) {
        }
    }
}

【问题讨论】:

    标签: android button android-intent audio-player


    【解决方案1】:

    我认为你在初始化之前检查了媒体播放器对象

      if (mp != null)
        {
            mp.stop();
            mp.release();
            mp = null;
        }
    

    确保在使用前初始化媒体播放器对象。

          mp=new MediaPlayer();
    
     if (mp != null)
        {
            mp.stop();
            mp.release();
            mp = null;
        }
    

    【讨论】:

    • 同样的问题,我将 MediaPlayer mp 作为全局变量,所以我可以检查它何时仍在播放(这样,如果我点击垃圾邮件按钮,它不会产生 1000 个声音)。无论如何我得到同样的错误。
    • 如果你使用prepareAsync(),那么你必须被try and catch块包围。
    • 一切都被 try-catch 块包围
    【解决方案2】:

    您应该在媒体播放器上使用prepareAsync() 方法,因为您正在播放音乐。只需更改 mp.prepare() 并对其进行测试。

    好像你没有实现onPreparedListener。实现这个接口,在onPrepared()里面调用mp.start就可以了。

    确保您的第二个活动实现MediaPlayer.OnPreparedListener

    您可以实现的其他一些接口是onErrorListener, onCompletionListener

    【讨论】:

    • 已更改,现在它给了我E/MediaPlayer: stop called in state 0 E/MediaPlayer: error (-38,0) E/MediaPlayer: stop called in state 4 E/MediaPlayer: error (-38,0) W/MediaPlayer: mediaplayer went away with unhandled events E/MediaPlayer: error (-38,0) E/MediaPlayer: error (1,-2147483648)
    • 我见过,但我可以使用它从 xml 文件中调用 android:onClick
    • 这里的想法是确保媒体播放器在你调用 ``start()` 之前处于正确的状态。它必须在prepared state。这就是为什么需要在接收到准备好的侦听器时调用该方法。
    • 好吧,我应该在mp.setOnPreparedListener(___)中输入什么?
    • 既然你的activity实现了接口,就把this.
    【解决方案3】:

    你可以这样做:

    public void play(){
        playButton.setImageResource(R.drawable.stop);
        player = new MediaPlayer();
        playing = true;
        player.setWakeMode(context, PowerManager.PARTIAL_WAKE_LOCK);
        player.setAudioStreamType(AudioManager.STREAM_MUSIC);
        player.setOnCompletionListener(this);
        player.setOnErrorListener(this);
        player.setOnPreparedListener(this);
        try {
            player.setDataSource(path);
        } catch (IOException e) {
            e.printStackTrace();
        }
        player.prepareAsync();
    }
    
    public void stop(){
        playButton.setImageResource(R.drawable.play);
        playing = false;
        player.stop();
        player.reset();
        player.release();
        player = null;
    }
    

    对于我的媒体播放器,我创建了一个自定义侦听器,其中按钮切换播放/停止功能(和图像资源)。 您应该使用 prepareAsync() 并将开始放在 OnPrepared 中。

    @Override
    public void onClick(View view) {
        if (!playing) {
            play();
    
        } else {
            stop();
    
        }
    }
    
    @Override
    public void onCompletion(MediaPlayer mediaPlayer) {
        playButton.setImageResource(R.drawable.play);
        mediaPlayer.stop();
        mediaPlayer.reset();
        mediaPlayer.release();
        //player = null;
        playing = false;
    }
    
    @Override
    public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {
        Log.i("Error","found");
        mediaPlayer.stop();
        mediaPlayer.reset();
        mediaPlayer.release();
        //player = null;
        playing = false;
        return false;
    }
    
    
    @Override
    public void onPrepared(MediaPlayer mediaPlayer) {
        Log.i("mediaplayer","preparato");
        mediaPlayer.start();
    
    }
    

    如果您在 sd 中播放外部音频,则您遇到的错误是(在我的情况下)连接到不正确的路径,设备没有外部 sd 卡,因此请注意您提供的路径

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-03
      • 2011-10-11
      • 2014-05-22
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      相关资源
      最近更新 更多