Stop/start 来自另一个 activity 的媒体播放器

Stop/start mediaplayer from another activity

我正在尝试使用 MediaplayerMP1 作为 Mediaplayer 的变量来播放 stream radio 我想在所有 Fragments 应用程序中播放它,期望一个 activity (ActivityOne) 包含另一个 Mediaplayer MP2 播放,所以我想停止 MP1 当我在 (ActivityOne) activity,然后播放 MP2,当我从 (ActivityOne) return 播放时,我想继续播放 MP1,我的大问题是当我单击存在于 fragment 中的 button 时调用的 (ActivityOne) 我下面的代码只能在一个方向上工作: 当我 return 来自 (ActivityOne) activity 时,音乐停止。

应用程序的结构:MainAcitivty > Fragment > ActivityOne

MainActivity.java

MediaPlayer MP1;
boolean prepared = false;
boolean started = false;
PlayerTask playerTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mediaPlayer = new MediaPlayer();
    playerTask = new PlayerTask();
    playerTask.execute(stream);
    /**/
       MusicButton = findViewById(R.id.toggleButton);
    MusicButton.setVisibility(View.INVISIBLE);
    MusicButton.setOnCheckedChangeListener(new OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (started && MusicButton.isChecked()) {
                started = false;
                MP1.pause();
                MusicButton.setChecked(true);
            } else {
                started = true;
                MP1.start();
                MusicButton.setChecked(false);
            }
        }
    });
}
@SuppressLint("StaticFieldLeak")
public class PlayerTask extends AsyncTask<String, Void, Boolean> {
    ProgressBar loadingRL = findViewById(R.id.progressBar);
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
            AudioAttributes attribs = new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_MEDIA).setContentType(AudioAttributes.CONTENT_TYPE_MUSIC).build();
            MP1.setAudioAttributes(attribs);

        } else {
            MP1.setAudioStreamType(AudioManager.STREAM_MUSIC);
        }
        loadingRL.setVisibility(View.VISIBLE);

    }

    @Override
    protected Boolean doInBackground(String... strings) {
        try {
            MP1.setDataSource(strings[0]);
            MP1.prepare();
            prepared = true;
        } catch (IOException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        }
        MP1.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer MP1) {
                MP1.start();

            }
        });
        return prepared;
    }

    @Override
    protected void onPostExecute(Boolean aBoolean) {
        super.onPostExecute(aBoolean);
        MusicButton.setVisibility(View.VISIBLE);
        MusicButton.setChecked(true);
         loadingRL.setVisibility(View.VISIBLE);
}

ActivityOne.java

    MediaPlayer MP2;
    boolean prepared = false;
    boolean started = false;
    ToggleButton music;
    PlayerTask playerTask = null;
    CoordinatorLayout coordinatorLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pop_for_ringtone);
        coordinatorLayout = findViewById(R.id.coord);
        MP2 = new MediaPlayer();
        playerTask = new PlayerTask();
        playerTask.execute(url);
}
  @SuppressLint("StaticFieldLeak")
    public class PlayerTask extends AsyncTask<String, Void, Boolean> {
        ProgressBar pb = findViewById(R.id.progress);

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
                AudioAttributes attribs = new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_MEDIA).setContentType(AudioAttributes.CONTENT_TYPE_MUSIC).build();
                MP2.setAudioAttributes(attribs);

            } else {
                MP2.setAudioStreamType(AudioManager.STREAM_MUSIC);
            }
        }

        @Override
        protected Boolean doInBackground(String... strings) {
            if (!isCancelled()) {
                try {
                    MP2.setDataSource(strings[0]);
                    MP2.prepare();
                    prepared = true;
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (IllegalStateException e) {
                    e.printStackTrace();
                }
                MP2.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer MP2) {
                        MP2.start();
                    }
                });

            }
            return prepared;
        }

        @Override
        protected void onPostExecute(Boolean aBoolean) {
            super.onPostExecute(aBoolean);
            music.setEnabled(true);
            music.setVisibility(View.VISIBLE);
            music.setChecked(true);
            all.setVisibility(View.VISIBLE);
        }

        @Override
        protected void onCancelled(Boolean aBoolean) {
            if (isCancelled() && MP2.isPlaying()) {
                MP2.stop();
            }
        }
    }

 @Override
    public void onBackPressed() {
        if (playerTask != null && playerTask.getStatus() == AsyncTask.Status.FINISHED) {
            if (MP2.isPlaying()) {
                MP2.stop();
            }
        } else if (playerTask != null && playerTask.getStatus() != AsyncTask.Status.FINISHED) {
            playerTask.cancel(true);
        }
        super.onBackPressed();
    }

我花了2天时间解决这个问题没有任何结果,请有人帮助我我会感谢他

您尝试过使用 startActivityForResult() 吗?

您可以使用 Otto 库解决这个问题。首先创建一个新的 Java class 但选择 enum 而不是在 enum 中你可以添加:PLAY 和 PAUSE 例如:

public enum PlaybackEvent {
   PLAY, PAUSE
}

然后,如果您不使用自定义 Application class,请创建一个并在 onCreate 方法中扩展 Applicationoverride。在您的 app gradle 中添加 compile 'com.squareup:otto:1.3.8' 然后在 Application class 中创建一个 Bus 的实例并注册。例如,它看起来像这样:

public class MApplication extends Application {
public static Bus sBus = new Bus(ThreadEnforcer.MAIN);
@Override
public void onCreate() {
    super.onCreate();
    sBus.register(this);
}

不要忘记将清单默认应用程序 class 替换为您的新应用程序

<application android:name="com.packagename.MApplication"

然后在你的 MainActivity class override 和 register/unregister 你的事件总线中 onResumeonPause

 @Override
protected void onResume() {
    super.onResume();
    try {
      MApplication.sBus.register(this);
    }
   catch(Exception e){
      e.printStackTrace();
   }
}

@Override
protected void onDestroy() {
    super.onDestroy();
   try {
      MApplication.sBus.unregister(this);
    }
   catch(Exception e){
      e.printStackTrace();
   }
}

然后在 MainActivity 中创建一个 public void 方法作为参数传递 PlayBackEventSubscribe 这样你就可以收听从你的 fragment class。例如:

 @Subscribe
public void handlePlaybackEvent(PlaybackEvent event) {
    switch (event) {
        case PLAY:
           if(MP1.isPlaying())
             MP1.pause();
            break;
        case PAUSE:
            if(!MP1.isPlaying())
             MP1.play();
            break;
    }
}

最后你要做的就是在开始第二个 activity 时从你的 fragment 发送消息,然后会去:

 MApplication.sBus.post(PlaybackEvent.PAUSE);

当然你也可以发送消息从第二个activity overriding onBackPressed开始重新播放MP1 把里面的代码行:

 MApplication.sBus.post(PlaybackEvent.PLAY);

希望这能帮助您解决问题。