在按钮上播放声音点击android

Posted

技术标签:

【中文标题】在按钮上播放声音点击android【英文标题】:Play sound on button click 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 【参考方案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;
        
    


【讨论】:

以上是关于在按钮上播放声音点击android的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iPad 上播放系统按钮点击声音?

C# Android:点击播放声音[关闭]

Android 播放短音的正确方法?

按钮onClickListener无法在Android中播放声音

按下一个按钮它会发出声音。快速点击按钮和声音播放弹出和点击

没有播放声音