播放片段里面的媒体播放器与背景服务

时间:2017-05-19 09:37:36

标签: android android-fragments android-service android-mediaplayer

我正在尝试使用片段和后台服务来实现直播无线电,但是每次我点击导航抽屉上的单选按钮我都无法到达播放器,因为它生成了一个,我只能控制第二个。这是我的片段类。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View v = inflater.inflate(R.layout.fragment_radio, container, false);

    init(v);

    ApiManager.getInstance().getRadioBroadcast(new ApiResponseLive.GetLiveBroadcastListener() {
        @Override
        public void onSuccess(StreamModel days) {
            turnRadioOn(ApiManager.streamModel);

        }

        @Override
        public void onFailure(String responseString) {

        }
    });

    registerHandler(v);
    return v;
}



private void turnRadioOn(StreamModel streamModel) {
    HashMap<Integer, ArrayList<GenericStreamItem>> broadcastDays = new HashMap<>();
    streamModel.setStreamAllArrays(broadcastDays);
    BroadcastPagerAdapter radioPagerAdapter = new BroadcastPagerAdapter(getChildFragmentManager(), getContext(), TAG);
    radioPager.setAdapter(radioPagerAdapter);
}

private void init(View v) {
    radioPager = (ViewPager) v.findViewById(R.id.broadcastRadioPager);
    radioTabLayout = (TabLayout) v.findViewById(R.id.tabsDays);
    radioTabLayout.setupWithViewPager(radioPager);
    radioPlay = (ToggleButton) v.findViewById(R.id.playButton);
    radioScrollView = (ScrollView) v.findViewById(R.id.radioScroll);

}


private void start(String url) {
    try {
        mp = new MediaPlayer();
        mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mp.setOnPreparedListener(this);
        mp.setDataSource(url);
        mp.prepareAsync();
        mp.setOnCompletionListener(this);
        Log.e("Radio::", "Working");

    } catch (Exception e) {
        Log.e("StreamAudioDemo", e.getMessage());
        e.printStackTrace();
    }
}

private void stop() {
    try {
        mp.pause();
        mp.stop();
        mp.reset();
        mp.release();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public static void stopRadio() {
    try {
        Log.e("stopRadio::", "Pause");
        mp.pause();
        mp.stop();
        mp.reset();
        mp.release();
    } catch (Exception e) {
        e.printStackTrace();
    }
}


@Override
public void onPrepared(MediaPlayer mp) {
    mp.start();

}

@Override
public void onCompletion(MediaPlayer mp) {

}

private void registerHandler(View v) {
    radioPlay.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (isChecked) {
                Log.e("Toggle::", "Enabled");
                radioService = new RadioService();
                radioService.initMediaPlayer(ApiManager.RADIO_URL);
            } else {
                Log.e("Toggle::", "Disabled");
                stop();
                stopRadio();
                radioService.onDestroy();
            }
        }
    });
    v.findViewById(R.id.radioBroadcast).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            radioScrollView.fullScroll(ScrollView.FOCUS_DOWN);
        }
    });
}

public class RadioService extends Service implements MediaPlayer.OnErrorListener {

    public void initMediaPlayer(String url) {
        // ...initialize the MediaPlayer here...

        ApiManager.getInstance().getRadioURL(new ApiResponseLive.GetTVStreamUrlListener() {
            @Override
            public void onSuccess(String tvUrl) {
                start(ApiManager.RADIO_URL);
                mp.setOnErrorListener(RadioService.this);
            }

            @Override
            public void onFailure(String responseString) {

            }
        });

    }

    @Override
    public boolean onError(MediaPlayer mp, int what, int extra) {
        // ... react appropriately ...
        // The MediaPlayer has moved to the Error state, must be reset!
        mp.reset();
        return false;
    }

    @Override
    public void onDestroy() {
        if (mp != null) mp.release();
    }

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

}

以下是我调用片段的方式:

RadioFragment radioFragment = new RadioFragment();
fragment = fm.findFragmentByTag("radio");
radioDrawer.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (fragment == null) {

fm.beginTransaction()
.remove(fm.findFragmentById(R.id.activity_content))
.add(R.id.activity_content, radioFragment, 
"radio").addToBackStack("main").commit();

            } else {
                fm.beginTransaction().replace(R.id.activity_content, 
 radioFragment, "radio");
            }
            fullView.closeDrawers();
        }
    });

0 个答案:

没有答案