在按钮上播放声音单击android


109

单击时如何获得一个按钮来播放原始声音?我刚刚创建了一个带有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
CAW

Answers:


227

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

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),以获取所需的按钮。我们将其强制转换为a,Button以便轻松将其分配给one正在初始化的变量。对于此答案的更多解释超出了此方法的范围。给出了它是如何工作的一个简短的洞察。

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

这是初始化的方法MediaPlayer。MediaPlayer遵循静态工厂方法设计模式。为了获得实例,我们调用它的create()方法,然后将要播放的声音的上下文和资源ID传递给它,在这种情况下为R.raw.soho。我们将其声明为final。乔恩斯基特提供了为什么我们如此做了很好的解释在这里

one.setOnClickListener(new OnClickListener(){

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

最后,我们设置先前初始化的按钮将执行的操作。单击按钮即可播放声音!为此,我们设置OnClickListener按钮的one。内部只有一种方法,onClick()其中包含按钮在单击时应执行的指令。

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

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

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


奖励部分:

如下面的评论所述,谢谢Langusten Gustel!,并且按照Android开发者参考中的建议,重要的是调用该release()方法以释放将不再使用的资源。通常,一旦要播放的声音播放完毕,便会执行此操作。要做到这一点,我们添加一个OnCompletionListener到我们mp ,像这样:

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

onCompletion方法内部,我们像这样释放它

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

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


原始帖子

第一。您应该将语句放入一个块中,在这种情况下,将其放在onCreate方法中。

第二。您将按钮初始化为变量1,然后使用了变量0并将其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
顺便说一下,它的one.setOnClickListener(new View.OnClickListener(){public void onClick(View v){mp.start();}}); 不要错过!
Auto-Droid -2013年

7
RELEASE
别忘

38

经过测试并能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块的情况下工作。
khwilo

37

最好的方法是在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:媒体播放器因未处理的事件而消失

因此,播放安全简单的代码即可使用媒体播放器。

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

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

玩吧!

玩得开心!


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

这是结果,再次没有任何作用dropbox.com/s/9xb0lzesp0ibx9z/2.jpg
德米特里(Dmitry)

不需要行mp = new MediaPlayer(),因为您将在下一行使用MediaPlayer.create(...)再次对其进行初始化。
Keale 2013年

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

在您的活动中,您需要MediaPlayeronCreate方法或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();
            }
        });
}
}

3

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

真好!

MediaActionSound

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

用途像:

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

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

试试这个,我认为它将起作用


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

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


3
欢迎使用Stack Overflow!最好在代码中添加一些解释和注释,以便将来的读者向您学习。
Mehdi Bounya

1

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

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

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

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

1

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

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

MediaPlayer几天前,我在课堂上遇到了这种性能问题。

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

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

SoundPool不如MediaPlayer该类容易使用,但在性能和可靠性方面却具有一些巨大的好处。

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

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

YouTube:保存解决方案

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.