【问题标题】:How To Play MediaPlayer's Next Song without reaching the End of the Current song如何在不到达当前歌曲结尾的情况下播放媒体播放器下一首歌曲
【发布时间】:2014-07-09 06:41:34
【问题描述】:

我有一个音乐播放器应用程序,它会剪切应该播放曲目的哪个部分。 我的问题是即使当前的媒体播放器曲目还没有到达歌曲的结尾,我如何播放下一首歌曲。我也尝试调用 onCompletion :

mplayer.stop();

        Log.v("PLAYER", "Audio track Stopped");
        checkTrackStatus();
        songHandler.removeCallbacks(uxUpdater);
        if(fis!=null)fis=null;

        if((currentTrack+1) < songs.size())
        {

            Log.v("Move to next track", songs.get(currentTrack+1).get("songTitle"));
            //mplayer.release();
            mplayer=null;
            currentTrack++;
            playSong(currentTrack);

        }else
            Toast.makeText(getApplication(), "All tracks played", Toast.LENGTH_LONG).show();

播放歌曲方法:

public void playSong(final int songIndex)
{
        File toPlay = new File(songs.get(songIndex).get("songPath"));

        lblTrackText.setText("Playing ["+(songIndex+1)+"/"+songs.size()+"]");
        lblTrackTitle.setText(songs.get(songIndex).get("songTitle"));
        //lblTrackTitle.setSelected(true);


        Log.v("PLAY SONG : ", toPlay.getPath());
        if(toPlay.exists())
        {
            //playAudio(toPlay);

            try{

                mplayer = new MediaPlayer(this);
                //mplayer.setOnCompletionListener(this);
                fis=new FileInputStream(new File(songs.get(songIndex).get("songPath"))); //ORIGINAL 'p'
                mplayer.setDataSource(fis.getFD());//need to add permission in manifest to play .m4a files "ACCESS_NETWORK_STATE"

                mplayer.prepare();




                //final String s =p;
                mplayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {

                    //getTotalTrackDuration

                    @Override
                    public void onPrepared(MediaPlayer mp) {
                        mplayer.seekTo(Integer.parseInt(songs.get(songIndex).get("songStart")));
                        mplayer.start();
                        //lblTotal.setText(timeConverter(mplayer.getDuration()));
                        setTrackNo();

                        //Log.v("NOW PLAYING ", s);
                        updateProgress();
                    }
                });

        } catch (Exception e) {
            Log.e("AUDIO PLAYER", "error: " + e.getMessage(), e);
        }

        }
        else
            Toast.makeText(getApplication(), songs.get(songIndex).get("songTitle")+" does not exist or is already deleted", Toast.LENGTH_LONG).show();


}

我总是收到一个错误提示

错误(1,-541478725) 0x00002ad8 (code=1) 处的致命信号 11 (SIGSEGV)

顺便说一句,我正在使用 vitamio 媒体播放器。

任何帮助都会很棒..谢谢

【问题讨论】:

    标签: java android android-music-player


    【解决方案1】:

    您收到的错误表明本机代码中存在错误,该错误必须存在于维生素媒体播放器中。您收到的错误似乎是内存错误,这让我认为资源没有释放并且设备内存不足。

    尝试添加通话:

    fis.close()
    

    在您的代码之前:

    if(fis!=null)fis=null;
    

    以确保您正确关闭上一首歌曲的流。

    来自this answer,您的问题也可能是您是loading a lot of images and sounds and causing the app to run out of memory。似乎具有不同 android 版本的不同设备可以以不同方式处理此问题,这意味着该应用可以在一部手机上运行,​​但不能在另一部手机上运行。

    【讨论】:

    • 不错!只是出于好奇,你必须改变什么? :)
    • 谢谢人..我想出了一个解决方案...当达到指定的结束时间(w/c 不是曲目的结束时间)时,我调用了 [MediaPlayerObj].seekTo([ MediaPlayerObj].getDuration()) 以调用 onCompletion 方法...呵呵
    • @MetaSnarf:非常好!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 2015-10-17
    相关资源
    最近更新 更多