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

Как получить кнопку для воспроизведения звука из 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;
    }



}
+89
27 авг. '13 в 7:08
источник поделиться
10 ответов

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

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();
            }
        });
    }
}
+189
27 авг. '13 в 7:21
источник

Протестировано и работает 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);
}
+34
25 авг. '15 в 14:38
источник

Связанные вопросы


Похожие вопросы

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

и играть в нее!

Повеселись!

+30
04 июл. '14 в 8:26
источник
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();
            }
        });
    }
}
+8
27 авг. '13 в 7:18
источник
  • Аудио должно быть помещено в 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();
            }
        });
}
}
+5
10 авг. '18 в 19:12
источник
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
10 дек. '17 в 18:58
источник
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();

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

+1
16 мая '18 в 15:24
источник

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

Ницца!

MediaActionSound

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

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

fun playBeepSound() {
    val sound = MediaActionSound()
    sound.play(MediaActionSound.START_VIDEO_RECORDING)
}
+1
12 февр. '19 в 18:09
источник

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

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

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

if (mp.isPlaying()) {
       mp.seekTo(0)
}
0
24 июл. '19 в 13:58
источник

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

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

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

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

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

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

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

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

-1
25 июн. '19 в 15:40
источник

Посмотрите другие вопросы по меткам или Задайте вопрос