我正在编写我的第一个Android应用程序,一个简单的媒体播放器,只是为了练习我的半体面的java /标记技能。
该应用程序将现在播放的屏幕作为“主要”页面以及歌曲浏览器和弹出式音乐控件。我在前者和后者都做了一些工作,但我遇到了MediaPlayer的问题。如果我开始播放歌曲,它将播放并暂停,直到我退出音乐控制对话框,然后重新输入。此时,它似乎创建了MediaPlayer对象的第二个实例。
package org.practicesession.zoomplayer;
import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.content.Intent;
import android.view.View;
import android.view.View.OnClickListener;
public class zoomPlayer extends Activity implements OnClickListener {
static MediaPlayer myPlayer;
private static int stateMediaPlayer;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
View returnButton = findViewById(R.id.button_return);
returnButton.setOnClickListener(this);
View playerControls = findViewById(R.id.album_art_panel);
playerControls.setOnClickListener(this);
View playlistView = findViewById(R.id.song_info_panel);
playlistView.setOnClickListener(this);
View shuffleButton = findViewById(R.id.player_shuffle_button);
shuffleButton.setOnClickListener(this);
View repeatButton = findViewById(R.id.player_repeat_button);
repeatButton.setOnClickListener(this);
View ratingButton = findViewById(R.id.player_rating_button);
ratingButton.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.album_art_panel:
Intent i = new Intent(this, PlayerControls.class);
startActivity(i);
break;
}
}
public static void setStateMediaPlayer(int i){
stateMediaPlayer = i;
}
public static int getStateMediaPlayer(){
return stateMediaPlayer;
}
}
package org.practicesession.zoomplayer;
import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
//Extends to implement the functionality of the main page
public class PlayerControls extends Activity implements OnClickListener{
private final int stateMP_Playing = 1;
private final int stateMP_Pausing = 2;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.playcontrols);
View exitButton = findViewById(R.id.controls_exit_pane);
exitButton.setOnClickListener(this);
View volUpButton = findViewById(R.id.controls_vol_up);
volUpButton.setOnClickListener(this);
View playButton = findViewById(R.id.controls_play);
playButton.setOnClickListener(this);
View volDownButton = findViewById(R.id.controls_vol_down);
volDownButton.setOnClickListener(this);
musicPlayback();
}
public void musicPlayback(){
zoomPlayer.myPlayer = new MediaPlayer();
zoomPlayer.myPlayer = MediaPlayer.create(this, R.raw.outta);
zoomPlayer.setStateMediaPlayer(stateMP_Pausing);
}
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.controls_exit_pane:
finish();
break;
case R.id.controls_play:
switch(zoomPlayer.getStateMediaPlayer()){
case stateMP_Playing:
zoomPlayer.myPlayer.pause();
zoomPlayer.setStateMediaPlayer(stateMP_Pausing);
break;
case stateMP_Pausing:
zoomPlayer.myPlayer.start();
zoomPlayer.setStateMediaPlayer(stateMP_Playing);
break;
}
break;
}
}
}
这似乎是一个普通的java问题,而不是其他任何问题。我已经尝试过set / get方法,静态变量,删除继承等无济于事
请注意上面的代码是因为这几个小时搞错了所以它不是那么整洁......例如,控件屏幕最初从主屏幕继承了许多导入和方法是共享的。我删除了这个以查看它是否导致问题但没有快乐
感谢您的帮助!
答案 0 :(得分:3)
我只是猜测这是因为你每次都在创建一个新的MediaPlayer? zoomPlayer.myPlayer = new MediaPlayer(); 尝试在别处创建它,然后在那里初始化
答案 1 :(得分:3)
如果我开始播放歌曲,它将播放并暂停,直到我退出音乐控制对话框,然后重新输入。此时,它似乎创建了MediaPlayer对象的第二个实例。
这就是你的代码告诉Android要做的事情。在Java中,new
运算符创建一个类的新实例。每次调用MediaPlayer
活动的onCreate()
时,您都会创建新的PlayerControls
。每当您致电startActivity()
以启动PlayerControls
活动时,都会发生这种情况。
通常,在Android中,音乐播放器将通过执行实际音乐播放的Service
来实现。这样,用户就无法与您的任何特定活动联系在一起。该服务将使用startForeground()
来确保它不会被Android关闭,此外,它会在状态栏中显示一个图标,提醒用户您的应用是导致音乐的原因(可能还会让他们快速访问你的活动)。
答案 2 :(得分:0)
您正在使用onCreate方法在弹出窗口中实例化MediaPlayer。不要在弹出窗口中实例化它,而是在Activity中执行一次。
答案 3 :(得分:0)
正如布伦特所说;也许只是创建它,如果还不存在:
public void musicPlayback()
{
if (zoomPlayer.mPlayer == null)
{
zoomPlayer.myPlayer = MediaPlayer.create(this, R.raw.outta);
}
zoomPlayer.setStateMediaPlayer(stateMP_Pausing);
}
(您不应该创建new MediaPlayer
- 只需使用静态create()
方法。