Воспроизведение звука при нажатии кнопки мыши
Как получить кнопку для воспроизведения звука из raw при нажатии? Я просто создал кнопку с 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;
}
}
Ответы
Ответ 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
), чтобы получить R.id.button1
кнопку. Мы бросили его в качестве Button
, так что легко присвоить его переменной one
, что мы инициализации. Объяснение того, как это работает, выходит за рамки этого ответа. Это дает краткое представление о том, как это работает.
final MediaPlayer mp = MediaPlayer.create(this, R.raw.soho);
Это как инициализировать MediaPlayer
. MediaPlayer следует шаблону разработки статического метода фабрики. Чтобы получить экземпляр, мы вызываем его метод create()
и передаем ему контекст и идентификатор ресурса звука, который мы хотим воспроизвести, в данном случае 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.
Во-вторых. Вы инициализировали кнопку как переменную единицу, затем использовали переменную ноль и установили ее 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();
}
});
}
}
Ответ 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);
}
Ответ 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 завершен без выхода
Не сбрасывая Media Player, вы получаете эту ошибку в LogCat:
Android: mediaplayer went away with unhandled events
Так что играйте в безопасный и простой код для использования медиаплеера.
Чтобы воспроизвести более одного звука в одном действии/фрагменте, просто измените 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();
}
});
}
}
Ответ 5
- Аудио должно быть помещено в
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
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();
}
});
Попробуйте это, я думаю, он будет работать
Ответ 7
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);
наконец запустить метод запуска в этом классе
mp.start();
файл будет работать, когда кнопка нажата, надеюсь, это было полезно!
Ответ 8
Есть несколько предустановленных звуков: SHUTTER_CLICK, FOCUS_COMPLETE, START_VIDEO_RECORDING, STOP_VIDEO_RECORDING.
Ницца!
MediaActionSound
Класс для создания звуков, соответствующих звукам, создаваемым различными действиями, выполняемыми медиа и API-интерфейсами камеры. Документы
использовать как:
fun playBeepSound() {
val sound = MediaActionSound()
sound.play(MediaActionSound.START_VIDEO_RECORDING)
}
Ответ 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
класс MediaPlayer
для использования? Не всегда. Если у вас короткие звуки, лучше использовать класс SoundPool
.
Экономичным и эффективным решением является класс SoundPool, который предлагает отличные функции и повышает производительность вашего приложения.
SoundPool не так прост в использовании, как класс MediaPlayer
но имеет некоторые большие преимущества, когда речь идет о производительности и надежности.
Перейдите по этой ссылке и узнайте, как использовать класс SoundPool в вашем приложении:
Сохранить решение