0

在我的应用程序中,我必须从外部存储播放歌曲。它工作正常,但有时媒体播放器在没有错误日志或警告的情况下停止。这是发生这种情况时出现的我的logcat:

04-12 11:18:31.528: D/jdwp(12465): sendBufferedRequest : len=0x39
04-12 11:18:31.541: D/jdwp(12465): sendBufferedRequest : len=0x3B
04-11 22:39:16.320: D/dalvikvm(16048): threadid=10: interp stack at 0x4bf6e000

04-11 22:39:16.326: D/jdwp(16048): sendBufferedRequest : len=0x3B

04-11 22:39:16.436: D/dalvikvm(16048): threadid=11: interp stack at 0x4bfa8000

04-11 22:39:16.436: D/dalvikvm(16048): threadid=11: calling run()

04-11 22:39:16.437: D/dalvikvm(16048): threadid=12: interp stack at 0x4bfb0000

04-11 22:39:16.437: D/dalvikvm(16048): threadid=12: calling run()

04-11 22:39:16.476: D/dalvikvm(16048): threadid=13: interp stack at 0x4bfb8000

04-11 22:39:16.476: D/dalvikvm(16048): threadid=13: calling run()

04-11 22:39:16.486: D/dalvikvm(16048): threadid=13: exiting

04-11 23:42:26.737: D/dalvikvm(3500): threadid=13: bye!

04-11 23:42:26.737: D/dalvikvm(3500): threadid=0: freeing

04-11 23:42:26.753: D/ACRA(3500): Using default Report Fields

04-11 23:42:26.765: D/ACRA(3500): Looking for error files in /data/data/com.pakagename/files

我正在尝试media.setdatasource(file.getFD)某些主题的建议,但它不起作用我需要你的帮助,谢谢

这是我创建媒体播放器时的代码:

try {
        try {
            Log.d("file music ", musicObject.getFilePath());
            FileInputStream fileInputStream = new FileInputStream(musicObject.getFilePath());
            mediaPlayer.setDataSource(fileInputStream.getFD());

        } catch (IOException e1) {

            e1.printStackTrace();
        }
        mediaPlayer.playlistEntry = musicObject;

        mediaPlayer.setOnCompletionListener(new OnCompletionListener() {

            @Override
            public void onCompletion(MediaPlayer mp) {
                Log.e("",
                        "onCompletion getPlaylistPlaybackMode "
                                + mPlaylist.getPlaylistPlaybackMode()
                                + " seleected track id "
                                + mPlaylist.getSelectedIndex());
                mMPHandler.sendEmptyMessageDelayed(MSG_MP_RELEASE, 500);
            }

        });

        mediaPlayer.setOnPreparedListener(new OnPreparedListener() {

            @Override
            public void onPrepared(MediaPlayer mp) {
                mediaPlayer.preparing = false;

                // we may start playing
                if (mPlaylist.getSelectedTrack() == mediaPlayer.playlistEntry
                        && mediaPlayer.playAfterPrepare) {
                    mediaPlayer.playAfterPrepare = false;
                    play();
                    Log.d("onprepared", "true");
                }

            }

        });

        mediaPlayer
                .setOnBufferingUpdateListener(new OnBufferingUpdateListener() {

                    @Override
                    public void onBufferingUpdate(MediaPlayer mp,
                            int percent) {
                        if (mPlayerEngineListener != null) {
                            mPlayerEngineListener.onTrackBuffering(percent);
                        }
                    }

                });

        mediaPlayer.setOnErrorListener(new OnErrorListener() {

            @Override
            public boolean onError(MediaPlayer mp, int what, int extra) {
                Log.w(UILApplication.TAG, "PlayerEngineImpl fail, what ("
                        + what + ") extra (" + extra + ")");
                CommonUtils.writetoFile( "PlayerEngineImpl fail, what ("
                        + what + ") extra (" + extra + ")", context);

                if (what == MediaPlayer.MEDIA_ERROR_UNKNOWN) {

                    if (mPlayerEngineListener != null) {
                        mPlayerEngineListener.onTrackStreamError();
                    }
                    stop();
                    return true;
                }

                if (what == -1) {
                    long failTime = System.currentTimeMillis();
                    if (failTime - mLastFailTime > FAIL_TIME_FRAME) {

                        mTimesFailed = 1;
                        mLastFailTime = failTime;
                        Log.w(UILApplication.TAG, "PlayerEngineImpl "
                                + mTimesFailed
                                + " fail within FAIL_TIME_FRAME");
                    } else {

                        mTimesFailed++;
                        if (mTimesFailed > ACCEPTABLE_FAIL_NUMBER) {
                            Log.w(UILApplication.TAG,
                                    "PlayerEngineImpl too many fails, aborting playback");
                            if (mPlayerEngineListener != null) {
                                mPlayerEngineListener.onTrackStreamError();
                            }
                            stop();
                            return true;
                        }
                    }
                }
                return false;
            }
        });

        mediaPlayer.preparing = true;
        try {
            mediaPlayer.prepare();
        } catch (IOException e) {

            e.printStackTrace();
        }

        if (mPlayerEngineListener != null) {
            mPlayerEngineListener.onTrackChanged(mPlaylist
                    .getSelectedTrack());
        }

        return mediaPlayer;
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    }

玩的时候:

if (mCurrentMediaPlayer != null
                && mCurrentMediaPlayer.musicObject != mPlaylist
                        .getSelected()) {
            try {
            mCurrentMediaPlayer.stop();
        } catch (IllegalStateException e) {
            // this may happen sometimes
        } finally {
            mCurrentMediaPlayer.release();
            mCurrentMediaPlayer = null;
        }
            mCurrentMediaPlayer = build(mPlaylist.getSelectedTrack());
        }

和汉德勒在oncompletionListener

protected Handler mMPHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        if(msg.what == MSG_MP_RELEASE) {
            if (mPlaylist.getPlaylistPlaybackMode() == PlaylistPlaybackMode.SHUFFLE_AND_REPEAT1
                    || mPlaylist.getPlaylistPlaybackMode() == PlaylistPlaybackMode.REPEAT1) {
                Log.e("",
                        "onCompletion getPlaylistPlaybackMode "
                                + mPlaylist.getPlaylistPlaybackMode()
                                + " seleected track id "
                                + mPlaylist.getSelectedIndex());
                play(mPlaylist.getSelectedIndex());
            } else if (!mPlaylist.isLastTrackOnList()
                    || mPlaylist.getPlaylistPlaybackMode() == PlaylistPlaybackMode.REPEAT
                    || mPlaylist.getPlaylistPlaybackMode() == PlaylistPlaybackMode.SHUFFLE_AND_REPEAT) {
                next();
            } else

            {
                stop();
            }
        }
    }
};

编辑:直到现在,我不知道会发生什么。当我在应用程序外执行一些或很多后台操作时会出现

 04-12 11:18:31.528: D/jdwp(12465): sendBufferedRequest : len=0x39
04-12 11:18:31.541: D/jdwp(12465): sendBufferedRequest : len=0x3B

也许是问题

编辑:我从 android 开发者网页中找到了一些信息:

Android 系统仅在内存不足时才会强制停止服务,并且必须为具有用户焦点的活动恢复系统资源。如果服务绑定到具有用户焦点的活动,则它不太可能被杀死,如果服务被声明在前台运行(稍后讨论),那么它几乎永远不会被杀死。否则,如果服务已启动并且长时间运行,那么系统将随着时间的推移降低其在后台任务列表中的位置,并且该服务将变得非常容易被杀死 - 如果您的服务已启动,那么您必须将其设计为优雅地处理系统重新启动。如果系统终止了您的服务,它会在资源再次可用时立即重新启动它(尽管这也取决于您从 onStartCommand() 返回的值,稍后讨论)。有关系统何时可能破坏服务的更多信息,请参阅进程和线程文档。

我怎么修不了?

4

0 回答 0