【问题标题】:Play sound on button click android在按钮上播放声音点击android
【发布时间】:2013-08-29 19:52:10
【问题描述】:

如何在单击时获得一个按钮以播放原始声音?我刚刚创建了一个 ID 为 button1 的按钮,但无论我写什么代码,都是错误的。

import android.media.MediaPlayer;

public class BasicScreenActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_basic_screen);
    }

    Button one = (Button)this.findViewById(R.id.button1);
    MediaPlayer = mp;
    mp = MediaPlayer.create(this, R.raw.soho);
    zero.setOnCliclListener(new View.OnClickListener() )

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.basic_screen, menu);
        return true;
    }



}

【问题讨论】:

  • 您可能希望自动管理资源,以便您可以调用MusicManager.getInstance().play(this, R.raw.my_sound);。如果是这样,这个库可能适合你:github.com/delight-im/Android-Audio

标签: android android-mediaplayer


【解决方案1】:

这是原帖中提供的代码中最重要的部分。

Button one = (Button) this.findViewById(R.id.button1);
final MediaPlayer mp = MediaPlayer.create(this, R.raw.soho);
one.setOnClickListener(new OnClickListener(){

    public void onClick(View v) {
        mp.start();
    }
});

一步一步解释:

Button one = (Button) this.findViewById(R.id.button1);

首先是用于播放声音的按钮的初始化。我们使用 Activity 的 findViewById,传递我们分配给它的 Id(在本例中为:R.id.button1),以获取我们需要的按钮。我们将其转换为Button,以便将其分配给我们正在初始化的变量one。解释更多它是如何工作的超出了这个答案的范围。 This 简要介绍了它的工作原理。

final MediaPlayer mp = MediaPlayer.create(this, R.raw.soho);

这是如何初始化MediaPlayer。 MediaPlayer 遵循Static Factory Method Design Pattern。为了获得一个实例,我们调用它的create() 方法并将我们想要播放的声音的上下文和资源ID 传递给它,在本例中为R.raw.soho。我们将其声明为final。 Jon Skeet 很好地解释了我们为什么这样做here

one.setOnClickListener(new OnClickListener(){

    public void onClick(View v) {
        //code
    }
});

最后,我们设置我们之前初始化的按钮将做什么。点击按钮播放声音!为此,我们设置按钮oneOnClickListener。里面只有一种方法,onClick(),它包含按钮应该在点击时执行的指令

public void onClick(View v) {
    mp.start();
}

要播放声音,我们调用 MediaPlayer 的 start() 方法。此方法开始播放声音。

现在,您可以在 Android 中播放按钮点击声音!


奖金部分:

如下评论中所述感谢 Langusten Gustel!,作为recommended in the Android Developer Reference,调用release() 方法以释放不再使用的资源非常重要。通常,这是在要播放的声音完成播放后完成的。为此,我们将OnCompletionListener 添加到我们的mp like so:

mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
    public void onCompletion(MediaPlayer mp) {
        //code
    }
});

onCompletion 方法中,我们将它释放like so:

public void onCompletion(MediaPlayer mp) {
    mp.release();
}

显然有更好的实现方式。例如,您可以将 MediaPlayer 设为类变量并处理其生命周期以及使用它的 FragmentActivity 的生命周期。但是,这是另一个问题的主题。为了缩小这个答案的范围,我写它只是为了说明如何在 Android 中单击按钮时播放声音


原帖

首先。你应该把你的语句放在一个块中,在这种情况下是 onCreate 方法。

第二。您将按钮初始化为变量 one,然后使用变量 zero 并将其 onClickListener 设置为不完整的 onClickListener。对 setOnClickListener 使用变量 one

第三,把播放声音的逻辑放到onClick里面。

总结:

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

public class BasicScreenActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {        
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_basic_screen);

        Button one = (Button)this.findViewById(R.id.button1);
        final MediaPlayer mp = MediaPlayer.create(this, R.raw.soho);
        one.setOnClickListener(new OnClickListener(){

            public void onClick(View v) {
                mp.start();
            }
        });
    }
}

【讨论】:

  • 顺便说一句,它的 one.setOnClickListener(new View.OnClickListener(){ public void onClick(View v) { mp.start(); } });不要错过!
  • 不要去RELEASE
【解决方案2】:

100% 测试和工作

public class MainActivity extends ActionBarActivity {
    Context context = this;
    MediaPlayer mp;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);
        mp = MediaPlayer.create(context, R.raw.sound);
        final Button b = (Button) findViewById(R.id.Button);
        b.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                try {
                    if (mp.isPlaying()) {
                        mp.stop();
                        mp.release();
                        mp = MediaPlayer.create(context, R.raw.sound);
                    } mp.start();
                } catch(Exception e) { e.printStackTrace(); }
            }
        });
    }
}

这就是我们所要做的一切

if (mp.isPlaying()) {
    mp.stop();
    mp.release();
    mp = MediaPlayer.create(context, R.raw.sound);
}

【讨论】:

  • 这在重放音频时也有效。播放声音时,我认为 mp.start() 可以在没有 try / catch 和 if 块的情况下工作。
【解决方案3】:

最好的方法是在这里我在 LogCat 中搜索一个又一个问题后发现

MediaPlayer mp;
mp = MediaPlayer.create(context, R.raw.sound_one);
mp.setOnCompletionListener(new OnCompletionListener() {
    @Override
    public void onCompletion(MediaPlayer mp) {
        // TODO Auto-generated method stub
        mp.reset();
        mp.release();
        mp=null;
    }
});
mp.start();

释放媒体播放器在 LogCat 中为您提供此错误:

Android:MediaPlayer 未发布就完成了

重置媒体播放器会在 LogCat 中为您提供此错误:

Android:媒体播放器因未处理的事件而消失

所以玩安全简单的代码来使用媒体播放器。

要在同一个 Activity/Fragment 中播放多个声音,只需在创建新的媒体播放器时更改 resID,例如

mp = MediaPlayer.create(context, R.raw.sound_two);

然后玩吧!

玩得开心!

【讨论】:

    【解决方案4】:
    import android.media.MediaPlayer;
    import android.os.Bundle;
    import android.app.Activity;
    import android.view.Menu;
    import android.view.View;
    import android.widget.Button;
    
    public class MainActivity extends Activity {
        MediaPlayer mp;
        Button one;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            mp = MediaPlayer.create(this, R.raw.soho);
            one = (Button)this.findViewById(R.id.button1);
    
            one.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    mp.start();
                }
            });
        }
    }
    

    【讨论】:

    • 这是结果,再次没有任何效果dropbox.com/s/9xb0lzesp0ibx9z/2.jpg
    • 您不需要 mp=new MediaPlayer() 行,因为您在下一行使用 MediaPlayer.create(...) 再次对其进行初始化。
    【解决方案5】:
    • 音频必须放在raw文件夹中,如果不存在, 创建一个。
    • raw 文件夹必须在 res 文件夹中
    • 名称中不得包含任何- 或特殊字符。

    在您的活动中,您需要有一个对象MediaPlayer,在onCreate 方法或onclick 方法中,您必须初始化MediaPlayer,如MediaPlayer.create(this, R.raw.name_of_your_audio_file),然后您的音频文件准备就绪要与start() 的调用一起播放,在您的情况下,由于您希望将其放置在按钮中,因此您必须将其放在onClick 方法中。

    例子:

    private Button myButton;
    private MediaPlayer mp;
    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.myactivity);
            mp = MediaPlayer.create(this, R.raw.gunshot);
    
            myButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mp.start();
                }
            });
    }
    }
    

    【讨论】:

      【解决方案6】:

      有一些预定义的声音:SHUTTER_CLICK、FOCUS_COMPLETE、START_VIDEO_RECORDING、STOP_VIDEO_RECORDING。

      不错!

      MediaActionSound

      用于产生与媒体和相机 API 采取的各种操作所产生的声音相匹配的类。 Docs

      像这样使用:

      fun playBeepSound() {
          val sound = MediaActionSound()
          sound.play(MediaActionSound.START_VIDEO_RECORDING)
      }
      

      【讨论】:

      • 请提供Java版本;您的代码在 Kotlin 中
      【解决方案7】:
      Button button1=(Button)findViewById(R.id.btnB1);
      button1.setOnClickListener(new OnClickListener(){
      public void onClick(View v) {
      MediaPlayer mp1 = MediaPlayer.create(this, R.raw.b1);
      mp1.start();
      }
      });
      

      试试这个,我认为它会工作

      【讨论】:

        【解决方案8】:
        public class MainActivity extends AppCompatActivity {
        
            public void clickMe (View view) {
        
                MediaPlayer mp = MediaPlayer.create(this, R.raw.xxx);
                mp.start();
        
            }
        

        创建按钮的方法可以在按下按钮时调用(onCreate),

        然后使用您的文件路径为 (MediaPlayer) 类创建一个变量

        MediaPlayer mp = MediaPlayer.create(this, R.raw.xxx);
        

        最终在该类中运行 start 方法

        mp.start();
        

        按下按钮时文件将运行,希望对您有所帮助!

        【讨论】:

        • 欢迎来到 Stack Overflow!如果您在代码中添加一些解释和注释会更好,以便将来的读者可以向您学习。
        【解决方案9】:

        而不是像 DeathRs 建议的那样重置它:

        if (mp.isPlaying()) {
               mp.stop();
               mp.release();
               mp = MediaPlayer.create(context, R.raw.sound);
        } mp.start();
        

        我们可以将 MediaPlayer 重置为开始使用:

        if (mp.isPlaying()) {
               mp.seekTo(0)
        }
        

        【讨论】:

          【解决方案10】:

          所有这些解决方案“听起来”都不错且合理,但也有一个很大的缺点。如果您的客户下载您的应用程序并反复按下您的按钮会怎样?

          如果您多次单击该按钮,您的MediaPlayer 有时会无法播放您的声音。

          几天前我在MediaPlayer 类中遇到了这个性能问题。

          MediaPlayer 类可以保存使用吗?不总是。如果你的声音很短,最好使用SoundPool 类。

          SoundPool 类是一种节省且高效的解决方案,它提供了强大的功能并提高了应用程序的性能。

          SoundPool 不像 MediaPlayer 类那样易于使用,但在性能和可靠性方面具有一些很大的优势。

          点击此链接,了解如何在您的应用程序中使用 SoundPool 类:

          https://developer.android.com/reference/android/media/SoundPool

          Youtube: Save Solution

          【讨论】:

            【解决方案11】:

            边缘情况:以上每个答案几乎都是正确的,但我陷入了边缘情况。如果任何用户在几秒钟内多次随机单击该按钮,则在播放一些声音后它不再响应。

            原因: 初始化Mediaplayer 对象非常昂贵。它还处理资源(音频文件),因此需要一些时间。当用户随机初始化并调用MediaPlayer的方法如start()stop()release()等时,会导致我遇到的IllegalStateException

            解决方案:感谢caw 在关于Android-Audio 的评论中提出的建议。 它只有一个简单的两个 java 类(MusicManager.javaSoundManager.java)。

            如果你想播放一次性声音文件,可以使用MusicManager.java -

            MusicManager.getInstance().play(MyActivity.this, R.raw.my_sound);
            

            你可以使用SoundManager.java频繁快速播放多个声音 -

            class MyActivity extends Activity {
            
                private SoundManager mSoundManager;
            
                @Override
                protected void onResume() {
                    super.onResume();
            
                    int maxSimultaneousStreams = 3;
                    mSoundManager = new SoundManager(this, maxSimultaneousStreams);
                    mSoundManager.start();
                    mSoundManager.load(R.raw.my_sound_1);
                    mSoundManager.load(R.raw.my_sound_2);
                    mSoundManager.load(R.raw.my_sound_3);
                }
            
                private void playSomeSound() {
                    if (mSoundManager != null) {
                        mSoundManager.play(R.raw.my_sound_2);
                    }
                }
            
                @Override
                protected void onPause() {
                    super.onPause();
            
                    if (mSoundManager != null) {
                        mSoundManager.cancel();
                        mSoundManager = null;
                    }
                }
            
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-06-16
              • 1970-01-01
              • 2012-07-07
              • 1970-01-01
              • 2016-01-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多