如何流式传输音频?

时间:2014-07-28 15:55:55

标签: android listview media-player

我有listview,mediaplayer和mediacontroller。当我在listview中触摸列表时,我想让媒体播放器从网址播放流音乐。
我的问题是媒体播放器只播放一首歌。当我在播放第一个列表音频时触摸第二个列表时,它不播放第二个列表音频。
但是我不知道原因,媒体播放器在播放第一个音频时播放第二个音频,当mediacontroller隐藏时。 我希望媒体播放器在媒体播放器显示和播放音频时停止并播放另一个音频 我尝试了两种模式,但结果相同。
请教我错误和不好的英语技巧。
第一种模式。

     public void onItemClick(AdapterView<?> parent, View view, int position,
                            long id) {
switch (position) {
case 0:
    try {
        mp.reset();
        mp.setDataSource(url);
        mp.prepare();
    } catch (IllegalArgumentException e) {
        //
        e.printStackTrace();
    } catch (IllegalStateException e) {
        //
        e.printStackTrace();
    } catch (IOException e) {
        //
        e.printStackTrace();
    }
    break;
case 1:
    try {
        mp.reset();
        mp.setDataSource(url2);
        mp.prepare();
    } catch (IllegalArgumentException e) {
        //
        e.printStackTrace();
    } catch (IllegalStateException e) {
        //
        e.printStackTrace();
    } catch (IOException e) {
        //
        e.printStackTrace();
    }
    break;
case 2:
    try {
        mp.reset();
        mp.setDataSource(url3);
        mp.prepare();
    } catch (IllegalArgumentException e) {
        //
        e.printStackTrace();
    } catch (IllegalStateException e) {
        //
        e.printStackTrace();
    } catch (IOException e) {
        //
        e.printStackTrace();
    }
    break;
}

第二种模式。

public void onItemClick(AdapterView<?> parent, View view, int position,
                            long id) {
    try {
        mp.reset();
        mp.setDataSource(url[position]);
        mp.prepare();
    } catch (IllegalArgumentException e) {
        //
        e.printStackTrace();
    } catch (IllegalStateException e) {
        //
        e.printStackTrace();
    } catch (IOException e) {
        //
        e.printStackTrace();
    }

Preparedlistner。

            mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mediaPlayer) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        controller.setEnabled(true);
                        controller.show(mp.getDuration());
                        mp.start();
                        try {
                            Method m = android.widget.MediaController.class.getDeclaredMethod("updatePausePlay");
                            m.setAccessible(true);
                            m.invoke(controller);
                        } catch (Exception e) {
                        }
                    }
                });
            }
        });
    }


的onCreate

        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_songs);

        ItemBean sample1 = new ItemBean();
        fishing.setName("sample1");

        ItemBean sample2 = new ItemBean();
        hana.setName("sample2");

        ItemBean sample3 = new ItemBean();
        takane.setName("sample3");

        List<ItemBean> list = new ArrayList<ItemBean>();
        list.add(sample1);
        list.add(sample2);
        list.add(sample3);

        sampleurl = getResources().getStringArray(R.array.sampleurl);

        mp = new MediaPlayer();
        controller = new MediaController(this);
        controller.setAnchorView(findViewById(R.id.mediaController));
        controller.setMediaPlayer(this);
        mp.setAudioStreamType(AudioManager.STREAM_MUSIC);

        samplelist = (ListView) findViewById(R.id.song_list);
        SonglistAdapter_test adapter = new SonglistAdapter_test(getApplicationContext(),list);
        samplelist.setAdapter(adapter);

        samplelist.setOnItemClickListener(this);
    }

1 个答案:

答案 0 :(得分:0)

你在某个地方打电话给mcontroller = new MediaController(context);和doClean()吗?在放置新媒体源之前,很可能需要重置控制器。在handler.post之前添加它(new Runnable(){:

doClean();
mcontroller = new MediaController(getActivity());//or this, depending whats your context