เล่นเสียงที่ปุ่มคลิก Android


113

ฉันจะรับปุ่มเพื่อเล่นเสียงจาก 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
คุณอาจต้องการให้ทรัพยากรได้รับการจัดการโดยอัตโนมัติเพื่อให้คุณสามารถโทรติดต่อMusicManager.getInstance().play(this, R.raw.my_sound);ได้ ถ้าเป็นเช่นนั้นห้องสมุดนี้อาจเหมาะสำหรับคุณ: github.com/delight-im/Android-Audio
caw

คำตอบ:


229

นี่เป็นส่วนที่สำคัญที่สุดในโค้ดที่ให้ไว้ในโพสต์ต้นฉบับ

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. จอน Skeet ให้คำอธิบายที่ดีเกี่ยวกับเหตุผลที่เราทำเช่นนั้นที่นี่

one.setOnClickListener(new OnClickListener(){

    public void onClick(View v) {
        //code
    }
});

สุดท้ายเราตั้งค่าว่าปุ่มเริ่มต้นก่อนหน้านี้จะทำอะไร เล่นเสียงเมื่อคลิกปุ่ม! การทำเช่นนี้เราตั้งค่าปุ่มของเราOnClickListener oneภายในเป็นเพียงหนึ่งในวิธีการonClick()ที่มีสิ่งที่คำแนะนำปุ่มควรทำเมื่อมีการคลิก

public void onClick(View v) {
    mp.start();
}

ในการเล่นเสียงเราเรียกว่าstart()วิธีการของ MediaPlayer วิธีนี้จะเริ่มเล่นเสียง

ตอนนี้คุณสามารถเล่นเสียงเมื่อคลิกปุ่มใน 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();
            }
        });
    }
}

1
และด้วยวิธีการที่ one.setOnClickListener (View OnClickListener ใหม่ () {โมฆะสาธารณะ onClick (View v) {mp.start ();}}); อย่าพลาด!
Auto-Droid ツ

8
RELEASE
อย่า

40

ผ่านการทดสอบและใช้งานได้ 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 () จะทำงานโดยไม่ต้องลอง / จับและถ้าบล็อก
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();

การไม่ปล่อย Media player ทำให้คุณมีข้อผิดพลาดนี้ใน LogCat:

Android: MediaPlayer สรุปได้โดยไม่ต้องปล่อย

การไม่รีเซ็ตเครื่องเล่นสื่อทำให้คุณมีข้อผิดพลาดนี้ใน LogCat:

Android: mediaplayer หายไปพร้อมกับเหตุการณ์ที่ไม่สามารถจัดการได้

ดังนั้นเล่นรหัสที่ปลอดภัยและง่ายในการใช้เครื่องเล่นสื่อ

หากต้องการเล่นมากกว่าหนึ่งเสียงใน Activity / Fragment เดียวกันเพียงแค่เปลี่ยน resID ในขณะที่สร้าง Media player ใหม่เช่น

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
Dmitry

คุณไม่จำเป็นต้องใช้บรรทัด mp = new MediaPlayer () เนื่องจากคุณกำลังเริ่มต้นอีกครั้งโดยใช้ MediaPlayer.create (... ) ในบรรทัดถัดไป
Keale

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
ยินดีต้อนรับสู่ Stack Overflow! จะดีกว่าถ้าคุณเพิ่มคำอธิบายและแสดงความคิดเห็นลงในโค้ดของคุณเพื่อให้ผู้อ่านในอนาคตสามารถเรียนรู้จากคุณได้
Mehdi Bounya

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วิธีการเหมือน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;
        }
    }

}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.