在android上单击按钮播放声音
我如何获得一个按钮,在单击时播放原始声音?我刚刚创建了一个id为在android上单击按钮播放声音,android,audio,click,android-mediaplayer,playback,Android,Audio,Click,Android Mediaplayer,Playback,我如何获得一个按钮,在单击时播放原始声音?我刚刚创建了一个id为button1的按钮,但无论我写什么代码,都是错误的 import android.media.MediaPlayer; public class BasicScreenActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInst
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;
}
}
这是原始帖子中提供的代码中最重要的部分
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);
首先是用于播放声音的按钮的初始化。我们使用活动的,传递我们分配给它的Id(在本例中:R.Id.button1
),来获得我们需要的按钮。我们将其转换为一个按钮
,以便将其分配给我们正在初始化的变量one
。更多地解释这是如何工作的超出了这个答案的范围。简要介绍了它的工作原理
final MediaPlayer mp = MediaPlayer.create(this, R.raw.soho);
这是如何初始化一个。MediaPlayer遵循以下规则。为了获得一个实例,我们调用它的方法并向它传递我们想要播放的声音的上下文和资源Id,在本例中是R.raw.soho
。我们将其声明为final
。乔恩·斯基特(Jon Skeet)就我们为什么这样做提供了一个很好的解释
最后,我们设置之前初始化的按钮将执行的操作。点击按钮播放声音!为此,我们将按钮one
的。里面只有一个方法,onClick()
,它包含了按钮单击时应该执行的操作说明
要播放声音,我们称之为MediaPlayer的方法。此方法开始播放声音
在那里,你现在可以在安卓系统中点击按钮播放声音了
奖金部分: 如以下评论所述,Hanks Langusten Gustel!,同样,调用该方法释放不再使用的资源也很重要。通常,一旦要播放的声音播放完毕,就会执行此操作。为此,我们在
mp
在onCompletion
方法中,我们发布了它
显然有更好的方法来实现这一点。例如,您可以将MediaPlayer设置为类变量,并处理其生命周期以及使用它的片段
或活动
的生命周期。然而,这是另一个问题的主题。为了保持这个答案的范围小,我写它只是为了说明如何在Android中播放按钮点击的声音
原职 首先。您应该将语句放在块中,在本例中是onCreate方法 第二。您将按钮初始化为变量1,然后使用变量0并将其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();
}
});
}
}
最好的方法是在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带走了未处理的事件
因此,请使用安全和简单的代码来使用媒体播放器
要在同一个活动/片段中播放多个声音,只需在创建新的媒体播放器(如
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(); }
}
});
}
}
这就是我们要做的一切 试试这个,我想它会有用的
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(这是您的音频文件的R.raw.name_)
,然后您的音频文件ir准备好播放并调用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();
}
});
}
}
有一些预定义的声音:快门点击、对焦完成、开始录像、停止录像 很好 MediaActionSound 用于生成声音的类,这些声音与媒体和摄影机API执行的各种操作产生的声音相匹配 使用类似于:
fun playBeepSound() {
val sound = MediaActionSound()
sound.play(MediaActionSound.START_VIDEO_RECORDING)
}
所有这些解决方案“听起来”都很不错,也很合理,但有一个很大的缺点。如果你的客户下载了你的应用程序并反复按下你的按钮,会发生什么
如果多次单击按钮,您的MediaPlayer
有时会无法播放您的声音
几天前,我在MediaPlayer
类中遇到了这个性能问题
MediaPlayer
类是否保存以供使用?并非总是如此。如果您的声音较短,最好使用SoundPool
类
SoundPool类是一个节省且高效的解决方案,它提供了强大的功能并提高了应用程序的性能
SoundPool不像MediaPlayer类那样易于使用,但在性能和可靠性方面有很大的优势
按照此链接学习如何在应用程序中使用SoundPool类:
而不是按照死亡专家的建议重新设置它:
if (mp.isPlaying()) {
mp.stop();
mp.release();
mp = MediaPlayer.create(context, R.raw.sound);
} mp.start();
我们可以使用以下方法将MediaPlayer重置为当前状态:
if (mp.isPlaying()) {
mp.seekTo(0)
}
边缘案例:上面的每个答案几乎都是正确的,但我被困在边缘案例中。如果任何用户在fe内多次随机单击按钮
public class MainActivity extends AppCompatActivity {
public void clickMe (View view) {
MediaPlayer mp = MediaPlayer.create(this, R.raw.xxx);
mp.start();
}
MediaPlayer mp = MediaPlayer.create(this, R.raw.xxx);
mp.start();
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();
}
});
}
}
fun playBeepSound() {
val sound = MediaActionSound()
sound.play(MediaActionSound.START_VIDEO_RECORDING)
}
if (mp.isPlaying()) {
mp.stop();
mp.release();
mp = MediaPlayer.create(context, R.raw.sound);
} mp.start();
if (mp.isPlaying()) {
mp.seekTo(0)
}
MusicManager.getInstance().play(MyActivity.this, R.raw.my_sound);
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;
}
}
}