播放声音按钮点击机器人

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






}
307998 次浏览
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();
}
});
}
}

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

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

首先是用于播放声音的按钮的初始化。我们使用活动的 findViewById,传递我们分配给它的 Id (在本例中为 R.id.button1) ,以获得我们需要的按钮。我们将它强制转换为 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
}
});

最后,我们设置先前初始化的按钮将执行的操作。播放一个声音的按钮点击!为此,我们设置按钮 oneOnClickListener。里面只有一个方法,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 成为一个类变量,并处理它的生命周期以及使用它的 FragmentActivity的生命周期。然而,这是另一个问题的主题。为了缩小这个答案的范围,我编写它只是为了说明 如何播放声音按钮点击在 Android


原文

首先,您应该将语句放在一个块中,在本例中是 onCreate 方法。

第二。将按钮初始化为变量 ,然后使用变量 并将其 onClickListener 设置为不完整的 onClickListener。对 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();
}
});
}
}

最好的方法是在这里,我找到后,在一个问题一个接一个的 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 中给出这个错误:

媒体播放器带着未处理的事件消失了

所以玩安全简单的代码使用媒体播放器。

要在同一个 Activity/Fragment 中播放多个声音,只需在创建新媒体播放器时更改 resID,如

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

然后播放!

玩得开心!

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

试试这个,我想会有用的

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

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

  • 音频必须放置在 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();
}
});
}
}

这里有一些预定义的声音: SHUTTER _ CLICK,FOCUS _ COMPLETE,START _ VIDEO _ RECORding,STOP _ VIDEO _ RECORding。

漂亮!

MediaActionSound

一种用于产生声音的类,这些声音与媒体和相机 API 采取的各种行动所产生的声音相匹配

用法如下:

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

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

如果你多次点击按钮,你的 MediaPlayer有时会无法播放你的声音。

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

MediaPlayer类是否保存以供使用?不总是这样。如果你的声音很短,最好使用 SoundPool类。

一个保存和高效的解决方案是 SoundPool 类,它提供了很好的特性并提高了应用程序的性能。

SoundPool 不像 MediaPlayer类那样易于使用,但在性能和可靠性方面有一些很大的好处。

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

Https://developer.android.com/reference/android/media/soundpool

Youtube: Save Solution Youtube: 保存解决方案

而不是像死亡受害者建议的那样重置:

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

我们可以重置 MediaPlayer 到它的开始使用:

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

一个边缘情况: 上面的每个答案几乎都是正确的,但我被困在一个边缘情况。如果任何用户在几秒钟内随机多次点击按钮,那么在播放一些声音之后它就不再响应了。

原因: 初始化 Mediaplayer对象非常昂贵。它还处理资源(音频文件) ,因此需要一些时间。当用户随机初始化和调用 MediaPlayer的方法,如 start()stop()release()等,可以导致 IllegalStateException我面临的问题。

解决方案: 感谢 在评论中对 仿生人-音频的建议。 它只有一个简单的两个 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;
}
}


}

在爪哇:

private void playBeepSound(){
MediaActionSound sound = new MediaActionSound();
sound.play(MediaActionSound.START_VIDEO_RECORDING);
}