java - 如何在播放新歌之前停止媒体播放器?
问题描述
我正在开发一个应用程序,该应用程序包含两个活动,一个是媒体播放器,另一个是要播放的歌曲列表,mp3 播放器工作正常,来自我传递名称的列表的活动歌曲和播放器工作正常。我有两个问题,如果用户播放歌曲并离开应用程序(歌曲一直在后台播放,这就是假设的工作方式)然后用户返回应用程序,搜索栏设置为 0 并且计时器到 0,有没有办法“保存”活动”......如果一首歌曲正在播放并且用户尝试播放另一首歌曲,歌曲播放在前一首歌曲之上,我尝试通过添加来解决这个问题在我的意图中,一个“关键”来识别是否是一个新的音频,然后做这样的事情:但不工作。
if (playerL != null) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop;
}
}
public class AudioPlayer extends Activity {
/////////////////////////////////////////////////////////////
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.audio_player_activity);
// Header
Bundle extra = getIntent().getExtras();
if (extra != null) {
Intent intent = getIntent();
id_d = intent.getStringExtra("Id");
heading = intent.getStringExtra("Heading");
fileN = intent.getStringExtra("fileName");
audioN = intent.getStringExtra("audioName");
playerL = intent.getStringExtra("newAudio");
meet_instructor_round_image = findViewById(R.id.audio_player_img);
playerHeading = findViewById(R.id.audio_player_heading);
playerHeading.setText(heading);
Picasso.with(this).load(imgUrl).transform(new CropCircleTransformation()).into(round_image);
createNotificationChannel();
activateNotification(id_d, heading, imgUrl, bio);
} else {
Intent intent = new Intent(getApplicationContext(), com.starvizn.newstarvizn.COMMON.Activities.MainActivity.class);
startActivity(intent);
}
pause = findViewById(R.id.btnAudioSubpause);
play = findViewById(R.id.btnAudioSubPlay);
songName = findViewById(R.id.workoutName);
initialTime = findViewById(R.id.initialTime);
songName.setText(audioN);
Uri uri = Uri.parse(getApplicationContext().getFilesDir()+"/Downloads/"+fileN+".mp3");
mediaPlayer = MediaPlayer.create(this, uri);
seekBar = findViewById(R.id.seekBar);
seekBar.setClickable(false);
pause.setVisibility(View.INVISIBLE);
// Open lesson view
lessons_layout = findViewById(R.id.player_lessons);
lessons_layout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e(TAG, "Aqui");
Intent intent = new Intent(getApplicationContext(), com.myApp.MainActivity.class);
intent.putExtra("Id", id_d);
startActivity(intent);
}
});
if (playerL != null) {
if (mediaPlayer.isPlaying()) {
}
}
}
public void player_play(View view) {
play.setVisibility(View.INVISIBLE);
pause.setVisibility(View.VISIBLE);
mediaPlayer.start();
finalTime = mediaPlayer.getDuration();
startTime = mediaPlayer.getCurrentPosition();
if (oneTimeOnly == 0) {
seekBar.setMax((int) finalTime);
oneTimeOnly = 1;
}
initialTime.setText(String.format("%02d:%02d",
TimeUnit.MILLISECONDS.toMinutes((long) startTime),
TimeUnit.MILLISECONDS.toSeconds((long) startTime) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long) startTime)))
);
seekBar.setProgress((int) startTime);
myHandler.postDelayed(UpdateSongTime, 100);
seekBar.setClickable(false);
pause.setVisibility(View.VISIBLE);
}
public void player_pause(View view) {
pause.setVisibility(View.INVISIBLE);
play.setVisibility(View.VISIBLE);
int temp = (int) startTime;
mediaPlayer.pause();
}
public void player_fwd(View view) {
int temp = (int) startTime;
if ((temp + fwdTime) <= finalTime) {
startTime = startTime + fwdTime;
mediaPlayer.seekTo((int) startTime);
} else {
Toast.makeText(getApplicationContext(), "Cannot jump forward 5 seconds!", Toast.LENGTH_LONG).show();
}
}
public void player_back(View view) {
int temp = (int) startTime;
if ((temp - backTime) > 0) {
startTime = startTime - backTime;
mediaPlayer.seekTo((int) startTime);
} else {
Toast.makeText(getApplicationContext(), "Cannot jump backward 5 seconds", Toast.LENGTH_LONG).show();
}
}
private Runnable UpdateSongTime = new Runnable() {
public void run() {
startTime = mediaPlayer.getCurrentPosition();
initialTime.setText(String.format("%02d:%02d",
TimeUnit.MILLISECONDS.toMinutes((long) startTime),
TimeUnit.MILLISECONDS.toSeconds((long) startTime) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.
toMinutes((long) startTime)))
);
seekBar.setProgress((int) startTime);
myHandler.postDelayed(this, 100);
}
};
@Override
public void onBackPressed() {
builder = new android.app.AlertDialog.Builder(this);
builder.setTitle("End Player").setMessage("Exit").setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer = null;
NotificationManager notificationManager = (NotificationManager) getApplicationContext().getSystemService(NOTIFICATION_SERVICE);
notificationManager.cancelAll();
Intent intent = new Intent(getApplicationContext(), com.myapp.MainActivity.class);
intent.putExtra("Id", id_d);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
}).setNegativeButton("No", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
builder.show();
}
}
解决方案
所以我想你只需要添加假设处理该过程的逻辑。正如文档所说,您有两种方法
getCurrentPosition()
,seekTo(long, int)
所以我认为您应该保存当前位置,例如在首选项中,并在 seekTo 方法的帮助下恢复您之前保存的数据。因此,借助它,您可以管理状态
当我在开发播放器应用程序时,我使用了 ExoPlayer,它更灵活且更易于使用。您可以尝试以下链接 https://codelabs.developers.google.com/codelabs/exoplayer-intro/#0
推荐阅读
- java - 如何比较 Intellij 中 2 个不同存储库的相同文件?
- python - 为什么在解析之前循环数据框中的列会导致索引错误,Python 3.6+?
- python - 使用日期时间列切片数据框(Python - Pandas)
- angular - 将 Angular 材质添加到 Nx 工作区
- python - Python 文档中的惯例是在函数/方法名称之后包含括号吗?
- javascript - 我正在尝试为名为“Fate Stay Night”的游戏制作 Discord Rich Presence,但代码不起作用
- python - 请帮助 Python 循环
- python - 在 Pandas 中将对象格式化为日期
- javascript - Firebase 托管错误错误:无法向 https://www.gstatic.com/firebasejs/releases 发出请求
- arrays - Euler Project 4:寻找最大的回文乘积