【问题标题】:How to stream audios?如何流式传输音频?
【发布时间】:2014-07-28 15:55:55
【问题描述】:

我有列表视图、媒体播放器和媒体控制器。当我在列表视图中触摸列表时,我想让媒体播放器从 url 播放流音乐。
我的问题是媒体播放器只播放一首歌。当我在播放第一个列表音频时触摸第二个列表时,它不会播放第二个列表音频。
但我不知道原因,当媒体控制器隐藏时,媒体播放器在播放第一个音频时播放第二个音频。
我希望 mediaplayer 在 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);
    }

【问题讨论】:

    标签: android listview media-player


    【解决方案1】:

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

    之前添加这个
    doClean();
    mcontroller = new MediaController(getActivity());//or this, depending whats your context
    

    【讨论】:

    • 谢谢你的评论!我添加了 onCreate 代码。 controller = new MediaController(this)在那里。我尝试将 doClean(); 放入 onCreate,但 doClean(); 是红色的(无法解析方法)。我在 onItemClickListner 中也收到了相同的消息。我把doClean();放错地方了吗?
    猜你喜欢
    • 2019-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 2017-05-09
    • 2011-04-12
    • 1970-01-01
    相关资源
    最近更新 更多