【问题标题】:Android MediaPlayer seek bar current position thread issuesAndroid MediaPlayer寻求栏当前位置线程问题
【发布时间】:2019-02-26 18:29:49
【问题描述】:

您好,我是 android 新手,我正在通过示例学习。我正在尝试创建一个活动,其中包含我的原始文件夹中所有歌曲的列表视图,底部有媒体播放器控件。到目前为止,我一切正常,但我似乎无法让SeekBar 停止强制关闭。

代码如下:

public class music extends ListActivity implements Runnable {

    private ArrayList<sound> mSounds = null;

    private soundadapter mAdapter = null;
    private ImageButton playbtn;
    private SeekBar seekbar;
    private int total;
    private MediaPlayer mp = null;
    private TextView selelctedFile = null;

    /** Called when the activity is first created. */

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.music);


        selelctedFile = (TextView) findViewById(R.id.selectedfile);

        seekbar = (SeekBar) findViewById(R.id.seekbar);
        seekbar.setProgress(0);

        // create a simple list

        mSounds = new ArrayList<sound>();

        sound s = new sound();

        s.setDescription("Rudolph The Red Nosed Reindeer");

        s.setSoundResourceId(R.raw.rudolphtherednosereindeer);

        mSounds.add(s);

        s = new sound();

        s.setDescription("Battery");

        s.setSoundResourceId(R.raw.battery);

        mSounds.add(s);

        mAdapter = new soundadapter(this, R.layout.listitem, mSounds);

        setListAdapter(mAdapter);

        playbtn = (ImageButton) findViewById(R.id.play);
        playbtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // TODO Auto-generated method stub
                try {
                    if (mp.isPlaying()) {
                        mp.pause();
                        playbtn.setImageResource(android.R.drawable.ic_media_play);

                    } else {
                        mp.start();
                        playbtn.setImageResource(android.R.drawable.ic_media_pause);

                    }
                } catch (Exception e) {

                    e.printStackTrace();
                    // TODO: handle exception
                }

            }
        });

    }

    @Override
    public void onListItemClick(ListView parent, View v, int position, long id) {

        sound s = (sound) mSounds.get(position);
        if (mp != null) {
            mp.reset();
            mp.release();

        }

        mp = MediaPlayer.create(this, s.getSoundResourceId());
        selelctedFile.setText(s.getDescription());
        playbtn.setImageResource(android.R.drawable.ic_media_pause);
        mp.start();
        total = mp.getDuration();
        seekbar.setMax(total);

        seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {

            @Override
            public void onStopTrackingTouch(SeekBar seekbar) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onStartTrackingTouch(SeekBar seekbar) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onProgressChanged(SeekBar seekBar, int progress,
                    boolean fromUser) {
                // TODO Auto-generated method stub
                if (fromUser) {
                    mp.seekTo(progress);
                    seekBar.setProgress(progress);
                }
            }
        });

        Thread currentThread = new Thread(this);
        currentThread.start();

    }

    @Override
    public void run() {
        // TODO Auto-generated method stub

        try {
            while (mp != null) {
                int currentPosition = mp.getCurrentPosition();
                Message msg = new Message();
                msg.what = currentPosition;
                threadHandler.sendMessage(msg);
                Thread.sleep(100);
            }
        }

        catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {

        }
    }

    private Handler threadHandler = new Handler() {
        public void handleMessage(Message msg) {
            // super.handleMessage(msg);
            // txt.setText(Integer.toString(msg.what));
            seekbar.setProgress(msg.what);
        }
    };

    @Override
    protected void onPause() {
        // TODO Auto-generated method stub

        mp.stop();
        mp.release();
        mp = null;
    }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        if(mp != null) {
            mp.stop();
            mp.release();
            mp = null;
        }
    }   
}

这是我多次点击不同歌曲时不断出现的错误:

04-14 02:53:00.452: W/dalvikvm(27452): threadid=19: thread exiting with uncaught    exception (group=0x40018560)    
04-14 02:53:00.466: E/AndroidRuntime(27452): FATAL EXCEPTION: Thread-22
04-14 02:53:00.466: E/AndroidRuntime(27452): java.lang.IllegalStateException
04-14 02:53:00.466: E/AndroidRuntime(27452): at android.media.MediaPlayer.getCurrentPosition(Native Method)
04-14 02:53:00.466: E/AndroidRuntime(27452): at net.cybercore.collapsingfromwithin.music.run(music.java:145)
04-14 02:53:00.466: E/AndroidRuntime(27452): at java.lang.Thread.run(Thread.java:1019)

第 145 行错误是:
int currentPosition = mp.getCurrentPosition();

我终其一生都无法弄清楚为什么它在播放 3 或 4 次后就死机了。

感谢任何帮助。我已经查看了其他几个网站的示例,包括 http://www.androidhive.info/2012/03/android-building-audio-player-tutorial/http://www.androiddevblog.net/android/playing-audio-in-android

**

更新

** 我想我修好了。感谢您的帮助我找到了Thread using for seekbar on android mediaplayer 所以我把它改成了

@Override
public void run() {
    // TODO Auto-generated method stub

    try {
        while (mp != null) {
            int currentPosition = mp.getCurrentPosition();
            Message msg = new Message();
            msg.what = currentPosition;
            threadHandler.sendMessage(msg);

            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
                System.out.println("interrupt exeption" + e);
            }
        }
    }

    catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        System.out.println("My exeption" + e);
    } 
}

我仍然收到错误,但它们并没有杀死我的应用程序。我认为这不是正确的做法,但它确实有效。

【问题讨论】:

    标签: multithreading seekbar android-mediaplayer illegalstateexception


    【解决方案1】:

    您应该在实例化时准备好您的媒体播放器。

    MediaPlayer 对象必须先进入 Prepared 状态,然后才能开始播放。 有两种方法(同步与异步)可以达到 Prepared 状态:调用 prepare()(同步)在方法调用返回后将对象转移到 Prepared 状态,或者调用 prepareAsync()(异步),它首先在调用返回后将对象转移到准备状态(这几乎是正确的方式),而内部播放器引擎继续进行其余的准备工作,直到准备工作完成。当准备完成或 prepare() 调用返回时,如果通过 setOnPreparedListener(android.media.MediaPlayer.OnPreparedListener) 预先注册了 OnPreparedListener,则内部播放器引擎将调用用户提供的回调方法,即 OnPreparedListener 接口的 onPrepared()。

    阅读here

    所以你应该在实例化播放器后调用 mp.prepare()。

    您还应该确保媒体播放器在播放时运行 run 方法。我会先添加 mp.isPlaying() 到 while 行。

    while (mp != null && mp.isPlaying()) {
               ...
    
            }
    

    IllegalStateException 表示您处于调用该方法的非法状态,例如,如果播放器停止。

    我不确定,但我认为这会在您暂停音乐时停止 run 方法。所以你应该尽量避免这种情况。我创建了一个布尔值来识别播放器正在播放或暂停,并在此期间使用它。

    【讨论】:

    • 感谢您的回复...我现在在该行收到错误消息。
    • 04-14 03:50:59.505: W/System.err(30752): at android.media.MediaPlayer.isPlaying(Native Method) 04-14 03:50:59.505: W/System .err(30752):在 net.cybercore.collapsingfromwithin.music.run(music.java:142)04-14 03:50:59.505:W/System.err(30752):在 java.lang.Thread.run( Thread.java:1019)
    • 抛出的是同一个异常吗?
    • 04-14 02:53:00.452: W/dalvikvm(27452): threadid=19: 线程以未捕获的异常退出 (group=0x40018560) 04-14 02:53:00.466: E/AndroidRuntime (27452): 致命异常: Thread-22 04-14 02:53:00.466: E/AndroidRuntime(27452): java.lang.IllegalStateException 04-14 02:53:00.466: E/AndroidRuntime(27452): 在 android。 media.MediaPlayer.getCurrentPosition(Native Method) 04-14 02:53:00.466: E/AndroidRuntime(27452): at net.cybercore.collapsingfromwithin.music.run(music.java:145) 04-14 02:53:00.466 : E/AndroidRuntime(27452): at java.lang.Thread.run(Thread.java:1019)
    • MediaPlayer.create 已经为你准备好文件我只是不断收到错误 int currentPosition = mp.getCurrentPosition();
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 2012-03-23
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    相关资源
    最近更新 更多