在android上单击按钮播放声音

在android上单击按钮播放声音,android,audio,click,android-mediaplayer,playback,Android,Audio,Click,Android Mediaplayer,Playback,我如何获得一个按钮,在单击时播放原始声音?我刚刚创建了一个id为button1的按钮,但无论我写什么代码,都是错误的 import android.media.MediaPlayer; public class BasicScreenActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInst

我如何获得一个按钮,在单击时播放原始声音?我刚刚创建了一个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;
    }



}

这是原始帖子中提供的代码中最重要的部分

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);
首先是用于播放声音的按钮的初始化。我们使用活动的,传递我们分配给它的Id(在本例中:
R.Id.button1
),来获得我们需要的按钮。我们将其转换为一个
按钮
,以便将其分配给我们正在初始化的变量
one
。更多地解释这是如何工作的超出了这个答案的范围。简要介绍了它的工作原理

final MediaPlayer mp = MediaPlayer.create(this, R.raw.soho);
这是如何初始化一个。MediaPlayer遵循以下规则。为了获得一个实例,我们调用它的方法并向它传递我们想要播放的声音的上下文和资源Id,在本例中是
R.raw.soho
。我们将其声明为
final
。乔恩·斯基特(Jon Skeet)就我们为什么这样做提供了一个很好的解释

最后,我们设置之前初始化的按钮将执行的操作。点击按钮播放声音!为此,我们将按钮
one
的。里面只有一个方法,
onClick()
,它包含了按钮单击时应该执行的操作说明

要播放声音,我们称之为MediaPlayer的方法。此方法开始播放声音

在那里,你现在可以在安卓系统中点击按钮播放声音了


奖金部分:

如以下评论所述,Hanks Langusten Gustel!,同样,调用该方法释放不再使用的资源也很重要。通常,一旦要播放的声音播放完毕,就会执行此操作。为此,我们在
mp

onCompletion
方法中,我们发布了它

显然有更好的方法来实现这一点。例如,您可以将MediaPlayer设置为类变量,并处理其生命周期以及使用它的
片段
活动
的生命周期。然而,这是另一个问题的主题。为了保持这个答案的范围小,我写它只是为了说明如何在Android中播放按钮点击的声音


原职 首先。您应该将语句放在块中,在本例中是onCreate方法

第二。您将按钮初始化为变量1,然后使用变量0并将其onClickListener设置为不完整的onClickListener。对setOnClickListener使用变量one

第三,将播放声音的逻辑放在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();
            }
        });
    }
}

最好的方法是在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:mediaplayer带走了未处理的事件

因此,请使用安全和简单的代码来使用媒体播放器

要在同一个活动/片段中播放多个声音,只需在创建新的媒体播放器(如

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


玩得开心

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

这就是我们要做的一切

试试这个,我想它会有用的

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);
最后在该类中运行start方法

mp.start();
该文件将运行时,按下按钮,希望这是有帮助的

  • 如果音频不存在,则必须将其置于
    raw
    文件夹中, 创建一个
  • 原始文件夹必须位于res文件夹内
  • 名称中不得有任何
    -
    或特殊字符
在您的活动中,您需要有一个对象
MediaPlayer
,在
onCreate
方法或
onclick
方法中,您必须初始化
MediaPlayer
,如
MediaPlayer.create(这是您的音频文件的R.raw.name_)
,然后您的音频文件ir准备好播放并调用
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();
            }
        });
}
}

有一些预定义的声音:快门点击、对焦完成、开始录像、停止录像

很好

MediaActionSound

用于生成声音的类,这些声音与媒体和摄影机API执行的各种操作产生的声音相匹配

使用类似于:

fun playBeepSound() {
    val sound = MediaActionSound()
    sound.play(MediaActionSound.START_VIDEO_RECORDING)
}
所有这些解决方案“听起来”都很不错,也很合理,但有一个很大的缺点。如果你的客户下载了你的应用程序并反复按下你的按钮,会发生什么

如果多次单击按钮,您的
MediaPlayer
有时会无法播放您的声音

几天前,我在
MediaPlayer
类中遇到了这个性能问题

MediaPlayer
类是否保存以供使用?并非总是如此。如果您的声音较短,最好使用
SoundPool

SoundPool类是一个节省且高效的解决方案,它提供了强大的功能并提高了应用程序的性能

SoundPool不像MediaPlayer类那样易于使用,但在性能和可靠性方面有很大的优势

按照此链接学习如何在应用程序中使用SoundPool类:


而不是按照死亡专家的建议重新设置它:

if (mp.isPlaying()) {
       mp.stop();
       mp.release();
       mp = MediaPlayer.create(context, R.raw.sound);
} mp.start();
我们可以使用以下方法将MediaPlayer重置为当前状态:

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

边缘案例:上面的每个答案几乎都是正确的,但我被困在边缘案例中。如果任何用户在fe内多次随机单击按钮
public class MainActivity extends AppCompatActivity {

    public void clickMe (View view) {

        MediaPlayer mp = MediaPlayer.create(this, R.raw.xxx);
        mp.start();

    }
MediaPlayer mp = MediaPlayer.create(this, R.raw.xxx);
mp.start();
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();
            }
        });
}
}
fun playBeepSound() {
    val sound = MediaActionSound()
    sound.play(MediaActionSound.START_VIDEO_RECORDING)
}
if (mp.isPlaying()) {
       mp.stop();
       mp.release();
       mp = MediaPlayer.create(context, R.raw.sound);
} mp.start();
if (mp.isPlaying()) {
       mp.seekTo(0)
}
MusicManager.getInstance().play(MyActivity.this, R.raw.my_sound);
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;
        }
    }

}