在我的 android 应用程序中开始新声音之前停止以前的声音

Posted

技术标签:

【中文标题】在我的 android 应用程序中开始新声音之前停止以前的声音【英文标题】:Stop the prevoius sound before starting a new sound in my android app 【发布时间】:2012-08-21 17:10:48 【问题描述】:

此代码不起作用.. 任何人都可以帮助我。当我运行此代码时,出现错误提示强制关闭应用程序。我想用开始一个新的声音 每次点击。这里我使用图片作为我的按钮

package com.kle;

import java.io.IOException;

import com.kle.Kid.R;

import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
//import android.widget.Button;
import android.widget.ImageView;


public class Thirteen extends Activity implements OnClickListener

int flag=1;
//Button b1;
MediaPlayer mp1,mp2,mp3,mp4,mp5,mp6,mp7,mp8,mp9,mp10;


ImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) 
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.thirteen);

    iv=(ImageView) findViewById(R.id.imageView1);

    ImageView image1=(ImageView) findViewById(R.id.imageView1);
    ImageView image2=(ImageView) findViewById(R.id.imageView2);
    ImageView image3=(ImageView) findViewById(R.id.imageView3);
    ImageView image4=(ImageView) findViewById(R.id.imageView4);
    ImageView image5=(ImageView) findViewById(R.id.imageView5);
    ImageView image6=(ImageView) findViewById(R.id.imageView6);
    ImageView image7=(ImageView) findViewById(R.id.imageView7);
    ImageView image8=(ImageView) findViewById(R.id.imageView8);
    ImageView image9=(ImageView) findViewById(R.id.imageView9);
    ImageView image10=(ImageView) findViewById(R.id.imageView10);

    //b1= (Button) findViewById(R.id.button1);
    mp1= MediaPlayer.create(Thirteen.this, R.raw.one);
    mp2= MediaPlayer.create(Thirteen.this, R.raw.two);
    mp3= MediaPlayer.create(Thirteen.this, R.raw.three);
    mp4= MediaPlayer.create(Thirteen.this, R.raw.four);
    mp5= MediaPlayer.create(Thirteen.this, R.raw.five);
    mp6= MediaPlayer.create(Thirteen.this, R.raw.six);
    mp7= MediaPlayer.create(Thirteen.this, R.raw.seven);
    mp8= MediaPlayer.create(Thirteen.this, R.raw.eight);
    mp9= MediaPlayer.create(Thirteen.this, R.raw.nine);
    mp10= MediaPlayer.create(Thirteen.this, R.raw.ten);


    image1.setOnClickListener(this);
    image2.setOnClickListener(this);
    image3.setOnClickListener(this);
    image4.setOnClickListener(this);
    image5.setOnClickListener(this);
    image6.setOnClickListener(this);
    image7.setOnClickListener(this);
    image8.setOnClickListener(this);
    image9.setOnClickListener(this);
    image10.setOnClickListener(this);
    //b1.setOnClickListener(this);








public void onClick(View v) 
    // TODO Auto-generated method stub


    switch(v.getId())

    case R.id.imageView1: 
        iv.setImageResource(R.drawable.kidone);
        mp2.stop();
        mp3.stop();
        mp4.stop();
        mp5.stop();
        mp6.stop();
        mp7.stop();
        mp8.stop();
        mp9.stop();
        mp10.stop();

        try 
            mp1.prepare();
         catch (IllegalStateException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
         catch (IOException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
        
        mp1.seekTo(0);
        mp1.start();


        break;
    
    case R.id.imageView2: 
        iv.setImageResource(R.drawable.kidtwo);
        mp1.stop();
        mp3.stop();
        mp4.stop();
        mp5.stop();
        mp6.stop();
        mp7.stop();
        mp8.stop();
        mp9.stop();
        mp10.stop();

        try 
            mp2.prepare();
         catch (IllegalStateException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
         catch (IOException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
        
        mp2.seekTo(0);
        mp2.start();





        break;
    
    case R.id.imageView3: 
        iv.setImageResource(R.drawable.kidthree);

        mp2.stop();
        mp1.stop();
        mp4.stop();
        mp5.stop();
        mp6.stop();
        mp7.stop();
        mp8.stop();
        mp9.stop();
        mp10.stop();

        try 
            mp3.prepare();
         catch (IllegalStateException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
         catch (IOException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
        
        mp3.seekTo(0);
        mp3.start();



        break;
        

【问题讨论】:

【参考方案1】:

首先,您必须检查您的 logcat 是否存在异常,以便您更容易找到问题的根源。 现在解决您的问题:您正在停止一个没有播放的媒体播放器...... 在停止媒体播放器之前添加检查:

private void stopPlaying(MediaPlayer mp)

     if (mp != null && mp.isPlaying())
     
          mp.stop();
     

然后调用:

stopPlaying(mp1);
stopPlaying(mp2);
stopPlaying(mp3);
...

(虽然我更喜欢使用数组进行这种编码,因为它会使代码更具可读性和更易于维护 - 使用循环)。

【讨论】:

它的工作声音很少,但在再次点击多次后,它会给出一条错误消息以强制关闭应用程序:( 检查你的logcat...没有它几乎不可能找到问题

以上是关于在我的 android 应用程序中开始新声音之前停止以前的声音的主要内容,如果未能解决你的问题,请参考以下文章

在高于 4.0 的 Android 版本中无法播放声音

Android 音池计时

声音不会在我的应用中播放

我想在我的 Android 游戏中播放音乐以及分析声音数据。使用 Unity C#

捕获音频/视频后无法播放系统声音

C# 使用 SoundPlayer 同时发出多个声音