【问题标题】:Accessing a single mediaplayer instance from multiple pages of a viewPager从 viewPager 的多个页面访问单个媒体播放器实例
【发布时间】:2020-11-08 06:23:40
【问题描述】:

我正在尝试从每个 ViewPager 页面访问单个媒体播放器实例。但是每个页面都会创建自己的媒体播放器。我该如何解决这个问题?

我已经在主要活动中声明了一个公共 Mediaplayer 对象。

public MediaPlayer mediaPlayer;

并将其引用发送到 ViewPagerAdapter

protected void onCreate(Bundle savedInstanceState) {
//Many code lines
viewPagerAdapter=new ViewPagerAdapter(getSupportFragmentManager(),this,0,data,mediaPlayer);
}

在 viewpager 适配器中,我在创建每个页面的位置再次传递 mediaplayer 引用

@NonNull
@Override
public Fragment getItem(int position) {
    page pg= new page(mediaPlayer);
    Bundle bundle=new Bundle();
    bundle.putStringArray("array",data.get(position));
    bundle.putString("title",mData[position]);
    pg.setArguments(bundle);
    return pg;
}

然后在每个页面上我都有一个回收器视图,所以我为它创建了一个适配器并再次传递媒体播放器实例

recyclerViewAdapter=new RecyclerViewAdapter(this.getContext(),data,mediaPlayer);

现在每个页面上都有几个按钮。每个按钮播放不同的音乐

   holder.btn_clk.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            try{
                mediaPlayer.release();
                Log.e("MP","Released.");
            }catch (Exception e){
                Log.e("MP","Released Error.");
            }

            mediaPlayer= MediaPlayer.create(mContext, file);
            mediaPlayer.start();
        }
    });

除了媒体播放器参考之外,一切正常。

似乎每个页面都创建了自己的媒体播放器实例。如果我在同一页面上按 2 个不同的按钮,则只会播放最新的音乐。但是,如果我在 2 个不同的页面上按 2 个不同的按钮,则两种音乐都在播放。

我的主要目标是添加一个通用浮动操作按钮,它将充当每个媒体播放器实例的停止按钮。 所以我在 viewpager 所在的 mainactivity 布局上添加了一个。

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <androidx.viewpager.widget.ViewPager
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/pager"/>

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|center"
        android:layout_margin="@dimen/fab_margin"
        android:clickable="true"
        app:backgroundTint="@color/orange_500"
        android:src="@drawable/ic_baseline_music_off_24"
        android:visibility="visible" />
</FrameLayout>

我怎样才能做到这一点?

【问题讨论】:

    标签: android android-viewpager android-mediaplayer floating-action-button


    【解决方案1】:

    这里

    mediaPlayer= MediaPlayer.create(mContext, file);
    

    您正在创建一个新的播放器实例,而不是使用现有的。

    这个定义应该出现在你的主要活动中。 仅使用上下文可能是。 并为每个页面设置文件。

    你应该改用这个构造函数

    Uri myUri = ....; 
    MediaPlayer mediaPlayer = new MediaPlayer();
    mediaPlayer.setAudioAttributes(
    AudioAttributes.Builder()
        .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
        .setUsage(AudioAttributes.USAGE_MEDIA)
        .build());
    

    然后,你可以像这样更新内容

    mediaPlayer.setDataSource(getApplicationContext(), myUri);
    mediaPlayer.prepare();
    mediaPlayer.start();
    

    【讨论】:

    • 那我怎样才能播放新音乐呢?我的意思是如何更改媒体播放器的文件 url?
    • 使用其他构造函数,我更新了上面的答案。
    • 哪个构造函数?
    • 现在我正在主要活动上创建媒体播放器 mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioAttributes(new AudioAttributes.Builder().setContentType(AudioAttributes.CONTENT_TYPE_MUSIC).setUsage(AudioAttributes.USAGE_MEDIA).build());
    • 并在每个按钮上单击我正在使用 try { mediaPlayer.setDataSource(mContext, file); } catch (IOException e) { e.printStackTrace(); } 尝试 { mediaPlayer.prepare(); } catch (IOException e) { e.printStackTrace(); } mediaPlayer.start();
    【解决方案2】:

    我通过创建一个新类解决了这个问题

    import android.media.MediaPlayer;
    import android.net.Uri;
    import android.view.View;
    
    public class MP {
        public static MediaPlayer mp;
    
    public static void stop(){
        if (mp != null){
            mp.stop();
        }
    }
    
        public static void Play(View view, Uri file){
            if (mp != null)
                mp.reset();
            MediaPlayer mediaPlayer = MediaPlayer.create(view.getContext(), file);
            mp = mediaPlayer;
            try{
                mediaPlayer.start();
            }catch (Exception e){
    
            }
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-06
      • 2013-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多