java - 从另一个 Activity 停止/启动媒体播放器

标签 java android android-fragments stream android-mediaplayer

我正在尝试使用 Mediaplayer 播放流广播,并将 MP1 作为 Mediaplayer 的变量,我想在所有 Fragments 应用程序中播放它,预计有一个 activity (ActivityOne) 包含另一个要播放的 Mediaplayer MP2,所以我想在以下情况下停止 MP1我在 (ActivityOne) activity 中,并播放 MP2 ,当我从 (ActivityOne) 返回时,我想恢复 MP1,我的大问题是当我单击 fragment 中存在的 button 时调用 (ActivityOne) 我下面的代码仅适用于一个方向: 当我从 (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();
    }

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

最佳答案

您可以使用Otto来解决这个问题图书馆。首先新建Java类但选择 enum相反,在里面enum您可以添加:播放和暂停例如:

public enum PlaybackEvent {
   PLAY, PAUSE
}

那么如果您没有使用自定义 Application类创建一个并扩展 Applicationoverride里面onCreate方法。在你的app gradle里面添加compile 'com.squareup:otto:1.3.8'然后创建 Bus 的实例里面Application上课并注册。例如,这看起来像这样:

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

不要忘记将 list 中的默认应用程序类替换为新的应用程序类

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

之后在您的MainActivity中类override并在 onResume 中注册/取消注册您的事件总线并在 onPause

 @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;
    }
}

您要做的最后一件事就是从您的 fragment 发送消息当开始第二个 Activity 时,将会发生:

 MApplication.sBus.post(PlaybackEvent.PAUSE);

当然,您也可以发送消息以再次播放第二个 Activity 中的 MP1 overriding onBackPressed放入代码行:

 MApplication.sBus.post(PlaybackEvent.PLAY);

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

关于java - 从另一个 Activity 停止/启动媒体播放器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48174613/

相关文章:

java - 如何在 JLabel 和 JTextField 上显示非科学格式的值?

java - Mockito不使用thenThrow引发异常

android - 我必须使用哪个功能才能使我的应用程序仅适用于包含 Orientation Sensor 的设备?

java - Java 中的按钮/图像及其定位(android 应用程序)问题

android - 从另一个 Activity 返回到 Activity-A 的特定 fragment

java - 这是什么意思 "No DRP key due to exception:java.lang.ClassNotFoundException: com.android.webview.chromium.Drp"?

java - 我怎样才能专注于谷歌地图的某个部分

java - 在 Java 运行时选择要扩展的子类

java - 使用 Fragment 后退按钮 android

android - 在某些 fragment 中隐藏抽屉导航