如何点击时从原始播放声音的按钮?我刚刚创建了一个标识为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;
}
}
答案 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设置为类变量,并将其生命周期与使用它的Fragment
或Activity
的生命周期一起处理。但是,这是另一个问题的主题。为了保持这个答案的范围很小,我写这篇文章只是为了说明如何在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
文件夹中(如果不存在),
创建一个。-
或特殊字符。在活动中,您需要在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.java
,SoundManager.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类: