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


109

Як я можу отримати кнопку для відтворення звуку із сирого під час клацання? Я щойно створив кнопку з 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
Напевно, ви хочете, щоб ресурси керували автоматично, щоб ви могли дзвонити 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);

По-перше, це ініціалізація кнопки, яка використовується для відтворення звуку. Ми використовуємо активність findViewById, передаючи ідентифікатор, призначений йому (у цьому прикладі:) 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();
}

Для відтворення звуку ми називаємо 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. Використовуйте змінну один для 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 ();}}); Не пропустіть цього!
Авто-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 () буде працювати без пробного / уловного режиму та блоків 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папці, якщо його немає, створіть його.
  • Неочищена папка повинна знаходитися всередині папки 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
Ласкаво просимо до переповнення стека! Було б краще, якщо ви додасте пояснення та коментарі до свого коду, щоб майбутні читачі могли дізнатися у вас.
Мехді Бунья

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якої я зіткнувся.

Рішення: Дякую каву за його пропозицію в коментарі про 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.