在按钮上播放声音点击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
);
最后,我们设置我们之前初始化的按钮将做什么。点击按钮播放声音!为此,我们设置按钮one
的OnClickListener
。里面只有一种方法,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 设为类变量并处理其生命周期以及使用它的 Fragment
或 Activity
的生命周期。但是,这是另一个问题的主题。为了缩小这个答案的范围,我写它只是为了说明如何在 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.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;
【讨论】:
以上是关于在按钮上播放声音点击android的主要内容,如果未能解决你的问题,请参考以下文章