Воспроизведение звука при нажатии кнопки Android


109

Как заставить кнопку воспроизводить звук из raw при нажатии? Я только что создал кнопку с идентификатором 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
Вы, вероятно, захотите, чтобы ресурсы управлялись автоматически, чтобы вы могли звонить MusicManager.getInstance().play(this, R.raw.my_sound);. Если да, то эта библиотека может быть для вас: github.com/delight-im/Android-Audio
caw

Ответы:


228

Это самая важная часть кода, представленного в исходном посте.

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, передавая ему присвоенный нам идентификатор (в данном примере case :) R.id.button1, чтобы получить нужную нам кнопку. Мы приводим его как a, 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();
}

Чтобы воспроизвести звук, мы вызываем start()метод MediaPlayer . Этот метод запускает воспроизведение звука.

Теперь вы можете воспроизводить звук при нажатии кнопки в Android!


Бонусная часть:

Как отмечено в комментарии ниже Спасибо, Лангустен Густель! , и, как рекомендовано в Справочнике разработчика 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. Используйте переменную 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
И, кстати, его one.setOnClickListener (новый View.OnClickListener () {public void onClick (View v) {mp.start ();}}); Не пропустите!
Auto-Droid ツ

7
не для того, чтобы добраться доRELEASE
Langusten Gustel

38

Проверено и работает на 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.
khwilo

37

Лучший способ сделать это здесь, я нашел после поиска одной проблемы за другой в 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: медиаплеер ушел с необработанными событиями

Так что не рискуйте и используйте простой код для использования медиаплеера.

Чтобы воспроизводить более одного звука в одном действии / фрагменте, просто измените resID при создании нового медиаплеера, например

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

и играй!

Радоваться, веселиться!


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

Вот результат, снова ничего не работает dropbox.com/s/9xb0lzesp0ibx9z/2.jpg
Дмитрий

Строка mp = new MediaPlayer () вам не нужна, потому что вы снова инициализируете ее, используя MediaPlayer.create (...) в следующей строке.
Кил

6
  • Аудио необходимо поместить в 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();
            }
        });
}
}

3

есть несколько предустановленных звуков: SHUTTER_CLICK, FOCUS_COMPLETE, START_VIDEO_RECORDING, STOP_VIDEO_RECORDING.

Ницца!

MediaActionSound

Класс для создания звуков, соответствующих тем, которые производятся различными действиями, выполняемыми API-интерфейсами мультимедиа и камеры. Документы

использовать как:

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

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

Попробуйте это, я думаю, это сработает


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

файл запустится при нажатии кнопки, надеюсь, это было полезно!


3
Добро пожаловать в Stack Overflow! Было бы лучше, если бы вы добавили в свой код некоторые пояснения и комментарии, чтобы будущие читатели могли учиться у вас.
Мехди Бунья

1

Вместо сброса, предложенного DeathRs:

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

мы можем просто сбросить MediaPlayer, чтобы он начал использовать:

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

1

Все эти решения "звучат" красиво и разумно, но есть один большой недостаток. Что произойдет, если ваш клиент загрузит ваше приложение и несколько раз нажмет вашу кнопку?

Ваш MediaPlayerбудет иногда не воспроизводить звук при нажатии на кнопку , чтобы много раз.

MediaPlayerНесколько дней назад я столкнулся с этой проблемой производительности в классе.

Можно ли использовать MediaPlayerсохранение класса? Не всегда. Если у вас короткие звуки, лучше использовать SoundPoolкласс.

Экономным и эффективным решением является класс SoundPool, который предлагает отличные функции и увеличивает производительность вашего приложения.

SoundPool не так прост в использовании, как его MediaPlayerкласс, но имеет некоторые большие преимущества, когда дело касается производительности и надежности.

Перейдите по этой ссылке и узнайте, как использовать класс SoundPool в своем приложении:

https://developer.android.com/reference/android/media/SoundPool

Youtube: Сохранить решение


0

Краевой случай: почти каждый ответ почти правильный, но я застрял в крайнем случае. Если какой-либо пользователь нажимает кнопку случайным образом несколько раз в течение нескольких секунд, то после воспроизведения звука он больше не реагирует.

Причина: инициализировать Mediaplayerобъект очень дорого. Он также имеет дело с ресурсами ( аудиофайлами ), поэтому для этого требуется некоторое время. Когда пользователи случайно инициализации и вызова метода MediaPlayerметодов «s , как 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;
        }
    }

}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.