在按钮上播放声音单击android

时间:2013-08-27 07:08:37

标签: android audio click android-mediaplayer playback

如何点击时从原始播放声音的按钮?我刚刚创建了一个标识为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;
    }



}

11 个答案:

答案 0 :(得分:184)

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

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
    }
});

最后,我们设置了之前初始化按钮的功能。点击按钮播放声音!为此,我们设置了按钮one的{​​{3}}。 Inside只有一种方法onClick(),其中包含按钮上按钮应该执行的操作

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

要播放声音,我们称之为MediaPlayer的OnClickListener方法。此方法开始播放声音。

在那里,您现在可以在Android按钮点击时播放声音了!


奖金部分:

正如下面的评论感谢Langusten Gustel!start()所述,调用recommended in the Android Developer Reference方法释放不再是资源的重要性用过的。通常,一旦要播放的声音完成播放就完成。为此,我们向mp release()

添加了OnCompletionListener
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 ,然后使用变量并将其onClickListener设置为不完整的onClickListener。使用变量 one 作为setOnClickListener。

第三,将逻辑放在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();
            }
        });
    }
}

答案 1 :(得分:34)

经过测试并正常工作

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);
}

答案 2 :(得分:29)

这是我在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: mediaplayer went away with unhandled events

因此,请使用安全且简单的代码来使用媒体播放器。

要在同一个活动/片段中播放多个声音,只需在创建新的媒体播放器时更改resID,如

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

播放它!

玩得开心!

答案 3 :(得分:8)

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();
            }
        });
    }
}

答案 4 :(得分:5)

  • 必须将音频放置在raw文件夹中(如果不存在), 创建一个。
  • 原始文件夹必须在res文件夹内
  • 名称中不能包含任何-或特殊字符。

在活动中,您需要在MediaPlayer方法或onCreate方法内部有一个对象onclick,您必须初始化MediaPlayer,例如{{ 1}},然后您的音频文件就可以通过调用MediaPlayer.create(this, R.raw.name_of_your_audio_file)来播放了,在这种情况下,由于您希望将其放在按钮中,因此必须将其放在{{1 }}方法。

示例:

start()

答案 5 :(得分:1)

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();
}
});

尝试这个我觉得它会起作用

答案 6 :(得分:1)

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

好!

  

MediaActionSound

     

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

使用方式:

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

答案 7 :(得分:0)

公共类MainActivity扩展了AppCompatActivity {

public void clickMe (View view) {

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

}

创建一个按钮,按下按钮时可以调用方法(oncCeate),

然后使用文件路径

为(MediaPlayer)类创建一个变量

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

最后在该类中运行start方法

mp.start();

按下按钮时文件会运行,希望这对你有帮助!

答案 8 :(得分:0)

与其按照DeathRs的建议进行重置:

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

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

{{1}}

答案 9 :(得分:0)

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

原因:初始化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;
        }
    }

}

答案 10 :(得分:-1)

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

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

几天前,我遇到了MediaPlayer类的性能问题。

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

SoundPool类是一种保存高效的解决方案,它提供了出色的功能并提高了应用程序的性能。

SoundPool不如MediaPlayer类易于使用,但在性能和可靠性方面却有很多好处。

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

Save Solution