我有一个循环所有按钮和一个停止按钮。当我还在页面上时,两个按钮都能正常工作。问题是,当我按下loop-all按钮时,它会按照预期播放一系列音频文件,但是当我离开页面时(即按下电话的后退按钮)并返回页面,音频没有停止!我按下停止按钮,但它什么也没做。阻止它的唯一方法是进入任务管理器并结束程序。在我看来,一旦我离开页面,mp2的引用就会丢失......有没有人对如何解决这个问题有任何建议。任何帮助,将不胜感激。这是代码:
public class OneVoc extends ActionBarActivity {
private ListView lv;
private MediaPlayer mp;
private MediaPlayer mp2;
int[] myAudio = {R.raw.v_1100, R.raw.v_1101, R.raw.v_1102, R.raw.v_1103, R.raw.v_1104, R.raw.v_1105,
R.raw.v_1113, R.raw.v_1106, R.raw.v_1107, R.raw.v_1108, R.raw.v_1109, R.raw.v_1110, R.raw.v_1112,
R.raw.v_1114, R.raw.v_1115, R.raw.v_1116};
int mCompleted = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.one_voc);
Button btnLoop = (Button) findViewById(R.id.button1);
Button btnStop = (Button) findViewById(R.id.button2);
btnStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (mp2 != null) {
if (mp2.isPlaying()) {
mp2.setOnCompletionListener(null);
mp2.stop();
}
mp2.reset();
mp2.release();
mp2 = null;
}
}
});
btnLoop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
mp2 = MediaPlayer.create(getBaseContext(), myAudio[0]);
mp2.setOnCompletionListener(new OnCompletionListener()
{
@Override
public void onCompletion(MediaPlayer mp2)
{
mCompleted++;
mp2.reset();
if (mCompleted < myAudio.length)
{
try
{
AssetFileDescriptor afd = getResources().openRawResourceFd(myAudio[mCompleted]);
if (afd != null)
{
mp2.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
afd.close();
mp2.prepare();
mp2.start();
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
else if (mCompleted == myAudio.length)
{
mCompleted =0;
try
{
AssetFileDescriptor afd = getResources().openRawResourceFd(myAudio[mCompleted]);
if (afd != null)
{
mp2.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
afd.close();
mp2.prepare();
mp2.start();
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
else
{
mCompleted=0;
mp2.release();
mp2 = null;
}
}
});
mp2.start();
}
});
答案 0 :(得分:0)
尝试覆盖onbackpressed方法
@Override
public void onBackPressed()
{
// code here to stop and finish()
super.onBackPressed();
}
答案 1 :(得分:0)
我认为它是一个音频缓冲区问题,内存加载到音频缓冲区并在以后持续存在,finish()可能无法帮助你。 当你按下Android按钮上的后退按钮时,它只是调用finish()来进行当前活动,而当你按下home按钮时它会调用onPause(), 你需要覆盖onBackPressed()方法,并在行super.onbackPressed()之前; 让你的代码停止播放。 当你去TakMgr它只是得到PID引用你的应用程序进程并杀死进程。 这就像System.exit(0);或android.os.process.kill(getMyPid()); 这简直就是你不想要的应用程序。
答案 2 :(得分:0)
你可以在onPause()中暂停你的mp并在onResume()中重启吗? 也许你还希望存储在savedInstance中,此时你就是这样!
希望它有用
答案 3 :(得分:0)
当你回来按活动时,只需停止媒体播放器并释放资源并完成活动即可。*
@Override
public void onBackPressed()
{
btnStop.performClick();
super.onBackPressed();
}