简体   繁体   English

Android Media Player不会停止(实时流URL)

[英]Android Media Player does not stop (live stream url)

I have a service to play sound. 我有播放声音的服务。

I'm trying to stop the sound when I receive a call but I can't. 我想在接到电话时停止声音,但不能。

I want to stop the sound when I receive a call and replay when it ends. 我想在接听电话时停止声音,并在结束时重播。

Someone know what I did wrong? 有人知道我做错了吗?

This is my Service code: 这是我的服务代码:

public class MyMediaPlayer extends Service implements OnInfoListener, OnPreparedListener, OnErrorListener, AudioManager.OnAudioFocusChangeListener {

    public static MediaPlayer mMediaPlayer;
    public static String START_PLAY = "START_PLAY";

    IBinder mBinder = new LocalBinder();
    MusicServicePhoneStateListener mPhoneListener;

    public static final String BROADCAST_ACTION = AC.PACKAGE_NAME+".ACTION_HEADSET_PLUG";
    Intent intent;


    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }

    public class LocalBinder extends Binder {
        /*public MyMediaPlayer getServerInstance() {
            return MyMediaPlayer.this;
        }*/
    }


    @Override
    public void onCreate()
    {
        super.onCreate();
        mPhoneListener = new MusicServicePhoneStateListener();
        ((TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE)).listen(mPhoneListener, PhoneStateListener.LISTEN_CALL_STATE);

        intent = new Intent(BROADCAST_ACTION);
    }//onCreate


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (intent.getBooleanExtra(START_PLAY, false)) {
            initializePlayer();
        }
        return START_STICKY;
    }


    public void initializePlayer() {

        mMediaPlayer = new MediaPlayer();
        mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        try {
            mMediaPlayer.setDataSource("rtsp://example.com/file.stream");
        }
        catch (Exception e) {
            Log.e("MyMediaPlayer", "Error");
        }
        mMediaPlayer.setOnBufferingUpdateListener(this);
        mMediaPlayer.setOnInfoListener(this);
        mMediaPlayer.setOnPreparedListener(this);
        mMediaPlayer.setOnErrorListener(this);
        mMediaPlayer.prepareAsync();

    }



    @Override
    public void onPrepared(MediaPlayer player) {
        startMediaPlayer();
    }

    public void onAudioFocusChange(int focusChange) {
        switch (focusChange) {
            case AudioManager.AUDIOFOCUS_GAIN:
                // resume playback
                if (mMediaPlayer == null) initializePlayer();
                else if (!mMediaPlayer.isPlaying()) mMediaPlayer.start();
                mMediaPlayer.setVolume(1.0f, 1.0f);
                break;

            case AudioManager.AUDIOFOCUS_LOSS:
                // Lost focus for an unbounded amount of time: stop playback and release media player
                stopMediaPlayer();
                break;

            case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
                // Lost focus for a short time, but we have to stop
                // playback. We don't release the media player because playback
                // is likely to resume
                pauseMediaPlayer();
                break;

            case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
                // Lost focus for a short time, but it's ok to keep playing
                // at an attenuated level
                if (mMediaPlayer.isPlaying()) mMediaPlayer.setVolume(0.1f, 0.1f);
                break;
        }

    }


    @Override
    public void onDestroy(){
        stopMediaPlayer();
        ((TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE)).listen(mPhoneListener, PhoneStateListener.LISTEN_NONE);
    }


    @Override
    public boolean onError(MediaPlayer player, int what, int extra) {

        if (what == MediaPlayer.MEDIA_ERROR_SERVER_DIED || what == MediaPlayer.MEDIA_ERROR_UNKNOWN || extra == MediaPlayer.MEDIA_ERROR_TIMED_OUT || extra == MediaPlayer.MEDIA_ERROR_IO) {
            Log.e("MediaPlayer","Error");
        }

        stopMediaPlayer();
        return true;
    }

    @Override
    public boolean onInfo(MediaPlayer mp, int what, int extra) {
        return false;
    }

    public void startMediaPlayer() {
        mMediaPlayer.start();
    }

    public void pauseMediaPlayer() {
        if(mMediaPlayer.isPlaying()) mMediaPlayer.pause();
    }

    public void stopMediaPlayer() {
        if(mMediaPlayer.isPlaying()) mMediaPlayer.stop();
        mMediaPlayer.release();
        mMediaPlayer = null;
        Log.d("MediaPlayer","stop()");
    }


    private class MusicServicePhoneStateListener extends PhoneStateListener {

        private boolean mResumeAfterCall = false;

        @Override
        public void onCallStateChanged(int state, String incoming_number) {
            switch (state) {
                case TelephonyManager.CALL_STATE_OFFHOOK:
                case TelephonyManager.CALL_STATE_RINGING:
                    mResumeAfterCall = mMediaPlayer.isPlaying();
                    stopMediaPlayer();
                    break;
                case TelephonyManager.CALL_STATE_IDLE:
                    if (mMediaPlayer == null && mResumeAfterCall) initializePlayer();
                    break;
                default:
                    break;
            }
        }
    }

}

I do not understand why pause() and stop() are not working :( 我不明白为什么pause()和stop()不起作用:(

I have put stopMediaPlayer(); 我把stopMediaPlayer(); on TelephonyManager.CALL_STATE_OFFHOOK || TelephonyManager.CALL_STATE_RINGING TelephonyManager.CALL_STATE_OFFHOOK || TelephonyManager.CALL_STATE_RINGING TelephonyManager.CALL_STATE_OFFHOOK || TelephonyManager.CALL_STATE_RINGING and initializePlayer(); TelephonyManager.CALL_STATE_OFFHOOK || TelephonyManager.CALL_STATE_RINGING和initializePlayer(); on TelephonyManager.CALL_STATE_IDLE an this work, but I do not know why not work with stop() or pause(). TelephonyManager.CALL_STATE_IDLE的这项工作,但我不知道为什么不使用stop()或pause()。

You can try a some hack. 您可以尝试一些技巧。

64 state explanation : 64状态说明:

It's the 'stopped' state. 这是“停止”状态。 When in that state, you need to call prepare() again before starting playback. 在这种状态下,您需要在开始播放之前再次调用prepare()。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM