Android - MediaPlayer:如何将 fastForward 分离到另一个方法(稍后将被调用)?
Android - MediaPlayer : How to separating fastForward to another method (that later will be call)?
这是我的片段:
public class MainActivity extends AppCompatActivity {
private int seekForwardTime = 5000;
private int seekBackwardTime = 5000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
seekForward.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick (View v) {
Toast.makeText(getApplicationContext(), "Seek Forward music", Toast.LENGTH_SHORT).show();
forwardSong(mediaPlayer);
}
});
}
public void forwardSong(MediaPlayer mediaPlayer) {
int currentPosition = mediaPlayer.getCurrentPosition();
String tag2 = "currentPosition";
Log.v(tag2, String.valueOf(mediaPlayer.getCurrentPosition()));
if (currentPosition + seekForwardTime <= mediaPlayer.getCurrentPosition()) {
mediaPlayer.seekTo(currentPosition + seekForwardTime);
} else {
String tag = "main activity";
Log.v(tag, "else state");
mediaPlayer.seekTo(mediaPlayer.getDuration());
}
}
}
根据标题,我想将 Fast Forward(每次按 5 秒前进)行为从 seekForward.OnClickListener 分离到另一种方法 (forwardSong)。
但是,当我触发 seekForward 时,它没有寻找,而是杀死了 mediaPlayer。所以我必须再次按下 'play' 按钮并从歌曲的开头开始。
我是不是漏掉了什么?我很高兴收到任何解决方案 and/or 的建议。
ps : Log语句请无视,我之前只是做了一些测试。
谢谢!
编辑 - 2017 年 9 月 8 日
根据要求,这里是 logcat
08-09 16:36:01.688 2707-2707/? I/art: Not late-enabling -Xcheck:jni (already on)
08-09 16:36:01.688 2707-2707/? W/art: Unexpected CPU variant for X86 using defaults: x86
08-09 16:36:01.781 2707-2707/? W/System: ClassLoader referenced unknown path: /data/app/com.example.android.musicplayer-2/lib/x86
08-09 16:36:01.791 2707-2707/? I/InstantRun: starting instant run server: is main process
08-09 16:36:01.856 2707-2707/? W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
08-09 16:36:02.094 2707-2707/com.example.android.musicplayer D/MediaPlayer: setSubtitleAnchor in MediaPlayer
08-09 16:36:02.189 2707-2730/com.example.android.musicplayer I/OpenGLRenderer: Initialized EGL, version 1.4
08-09 16:36:02.189 2707-2730/com.example.android.musicplayer D/OpenGLRenderer: Swap behavior 1
08-09 16:36:02.189 2707-2730/com.example.android.musicplayer W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
08-09 16:36:02.189 2707-2730/com.example.android.musicplayer D/OpenGLRenderer: Swap behavior 0
08-09 16:36:02.219 2707-2730/com.example.android.musicplayer D/EGL_emulation: eglCreateContext: 0xa1328e80: maj 2 min 0 rcv 2
08-09 16:36:02.264 2707-2730/com.example.android.musicplayer D/EGL_emulation: eglMakeCurrent: 0xa1328e80: ver 2 0 (tinfo 0xa1320a20)
08-09 16:36:02.333 2707-2707/com.example.android.musicplayer W/art: Before Android 4.1, method int android.support.v7.widget.ListViewCompat.lookForSelectablePosition(int, boolean) would have incorrectly overridden the package-private method in android.widget.ListView
08-09 16:36:02.343 2707-2730/com.example.android.musicplayer D/EGL_emulation: eglMakeCurrent: 0xa1328e80: ver 2 0 (tinfo 0xa1320a20)
08-09 16:58:47.717 2707-2730/com.example.android.musicplayer D/EGL_emulation: eglMakeCurrent: 0xa1328e80: ver 2 0 (tinfo 0xa1320a20)
08-09 16:58:47.747 2707-2730/com.example.android.musicplayer D/EGL_emulation: eglMakeCurrent: 0xa1328e80: ver 2 0 (tinfo 0xa1320a20)
08-09 16:58:48.672 2707-2707/com.example.android.musicplayer V/currentPosition: 707
08-09 16:58:48.673 2707-2707/com.example.android.musicplayer V/main activity: else state
08-09 16:58:49.669 2707-2730/com.example.android.musicplayer D/EGL_emulation: eglMakeCurrent: 0xa1328e80: ver 2 0 (tinfo 0xa1320a20)
08-09 16:58:50.684 2707-2730/com.example.android.musicplayer D/EGL_emulation: eglMakeCurrent: 0xa1328e80: ver 2 0 (tinfo 0xa1320a20)
08-09 16:58:51.667 2707-2730/com.example.android.musicplayer D/EGL_emulation: eglMakeCurrent: 0xa1328e80: ver 2 0 (tinfo 0xa1320a20)
08-09 16:58:53.631 2707-2730/com.example.android.musicplayer D/EGL_emulation: eglMakeCurrent: 0xa1328e80: ver 2 0 (tinfo 0xa1320a20)
我很困惑。为什么会进入else语句?
按以下方式修改您的 forwardSong
函数:
public void forwardSong(MediaPlayer mediaPlayer) {
int currentPosition = mediaPlayer.getCurrentPosition();
String tag2 = "currentPosition";
Log.v(tag2, String.valueOf(mediaPlayer.getCurrentPosition()));
if (currentPosition + seekForwardTime <= mediaPlayer.getDuration()) {
mediaPlayer.seekTo(currentPosition + seekForwardTime);
} else {
String tag = "main activity";
Log.v(tag, "else state");
mediaPlayer.seekTo(mediaPlayer.getDuration());
}
}
以下条件是问题所在,它始终为假,并且由于您的 else 语句,mediaplayer
将始终查找到您的媒体文件的末尾。
if (currentPosition + seekForwardTime <= mediaPlayer.getCurrentPosition())
这是我的片段:
public class MainActivity extends AppCompatActivity {
private int seekForwardTime = 5000;
private int seekBackwardTime = 5000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
seekForward.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick (View v) {
Toast.makeText(getApplicationContext(), "Seek Forward music", Toast.LENGTH_SHORT).show();
forwardSong(mediaPlayer);
}
});
}
public void forwardSong(MediaPlayer mediaPlayer) {
int currentPosition = mediaPlayer.getCurrentPosition();
String tag2 = "currentPosition";
Log.v(tag2, String.valueOf(mediaPlayer.getCurrentPosition()));
if (currentPosition + seekForwardTime <= mediaPlayer.getCurrentPosition()) {
mediaPlayer.seekTo(currentPosition + seekForwardTime);
} else {
String tag = "main activity";
Log.v(tag, "else state");
mediaPlayer.seekTo(mediaPlayer.getDuration());
}
}
}
根据标题,我想将 Fast Forward(每次按 5 秒前进)行为从 seekForward.OnClickListener 分离到另一种方法 (forwardSong)。
但是,当我触发 seekForward 时,它没有寻找,而是杀死了 mediaPlayer。所以我必须再次按下 'play' 按钮并从歌曲的开头开始。
我是不是漏掉了什么?我很高兴收到任何解决方案 and/or 的建议。
ps : Log语句请无视,我之前只是做了一些测试。
谢谢!
编辑 - 2017 年 9 月 8 日
根据要求,这里是 logcat
08-09 16:36:01.688 2707-2707/? I/art: Not late-enabling -Xcheck:jni (already on)
08-09 16:36:01.688 2707-2707/? W/art: Unexpected CPU variant for X86 using defaults: x86
08-09 16:36:01.781 2707-2707/? W/System: ClassLoader referenced unknown path: /data/app/com.example.android.musicplayer-2/lib/x86
08-09 16:36:01.791 2707-2707/? I/InstantRun: starting instant run server: is main process
08-09 16:36:01.856 2707-2707/? W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
08-09 16:36:02.094 2707-2707/com.example.android.musicplayer D/MediaPlayer: setSubtitleAnchor in MediaPlayer
08-09 16:36:02.189 2707-2730/com.example.android.musicplayer I/OpenGLRenderer: Initialized EGL, version 1.4
08-09 16:36:02.189 2707-2730/com.example.android.musicplayer D/OpenGLRenderer: Swap behavior 1
08-09 16:36:02.189 2707-2730/com.example.android.musicplayer W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
08-09 16:36:02.189 2707-2730/com.example.android.musicplayer D/OpenGLRenderer: Swap behavior 0
08-09 16:36:02.219 2707-2730/com.example.android.musicplayer D/EGL_emulation: eglCreateContext: 0xa1328e80: maj 2 min 0 rcv 2
08-09 16:36:02.264 2707-2730/com.example.android.musicplayer D/EGL_emulation: eglMakeCurrent: 0xa1328e80: ver 2 0 (tinfo 0xa1320a20)
08-09 16:36:02.333 2707-2707/com.example.android.musicplayer W/art: Before Android 4.1, method int android.support.v7.widget.ListViewCompat.lookForSelectablePosition(int, boolean) would have incorrectly overridden the package-private method in android.widget.ListView
08-09 16:36:02.343 2707-2730/com.example.android.musicplayer D/EGL_emulation: eglMakeCurrent: 0xa1328e80: ver 2 0 (tinfo 0xa1320a20)
08-09 16:58:47.717 2707-2730/com.example.android.musicplayer D/EGL_emulation: eglMakeCurrent: 0xa1328e80: ver 2 0 (tinfo 0xa1320a20)
08-09 16:58:47.747 2707-2730/com.example.android.musicplayer D/EGL_emulation: eglMakeCurrent: 0xa1328e80: ver 2 0 (tinfo 0xa1320a20)
08-09 16:58:48.672 2707-2707/com.example.android.musicplayer V/currentPosition: 707
08-09 16:58:48.673 2707-2707/com.example.android.musicplayer V/main activity: else state
08-09 16:58:49.669 2707-2730/com.example.android.musicplayer D/EGL_emulation: eglMakeCurrent: 0xa1328e80: ver 2 0 (tinfo 0xa1320a20)
08-09 16:58:50.684 2707-2730/com.example.android.musicplayer D/EGL_emulation: eglMakeCurrent: 0xa1328e80: ver 2 0 (tinfo 0xa1320a20)
08-09 16:58:51.667 2707-2730/com.example.android.musicplayer D/EGL_emulation: eglMakeCurrent: 0xa1328e80: ver 2 0 (tinfo 0xa1320a20)
08-09 16:58:53.631 2707-2730/com.example.android.musicplayer D/EGL_emulation: eglMakeCurrent: 0xa1328e80: ver 2 0 (tinfo 0xa1320a20)
我很困惑。为什么会进入else语句?
按以下方式修改您的 forwardSong
函数:
public void forwardSong(MediaPlayer mediaPlayer) {
int currentPosition = mediaPlayer.getCurrentPosition();
String tag2 = "currentPosition";
Log.v(tag2, String.valueOf(mediaPlayer.getCurrentPosition()));
if (currentPosition + seekForwardTime <= mediaPlayer.getDuration()) {
mediaPlayer.seekTo(currentPosition + seekForwardTime);
} else {
String tag = "main activity";
Log.v(tag, "else state");
mediaPlayer.seekTo(mediaPlayer.getDuration());
}
}
以下条件是问题所在,它始终为假,并且由于您的 else 语句,mediaplayer
将始终查找到您的媒体文件的末尾。
if (currentPosition + seekForwardTime <= mediaPlayer.getCurrentPosition())