134

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



}
4

11 回答 11

256

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

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),来获得我们需要的按钮。我们将其转换为 aButton以便将其分配给one我们正在初始化的变量。解释更多它是如何工作的超出了这个答案的范围。简要介绍了它的工作原理。

final MediaPlayer mp = MediaPlayer.create(this, R.raw.soho);

这是如何初始化一个MediaPlayer. MediaPlayer 遵循静态工厂方法设计模式。为了获得一个实例,我们调用它的create()方法并将我们想要播放的声音的上下文和资源 ID 传递给它,在这种情况下是R.raw.soho。我们将其声明为final。Jon Skeet 很好地解释了我们为什么在这里这样做。

one.setOnClickListener(new OnClickListener(){

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

最后,我们设置我们之前初始化的按钮将做什么。点击按钮播放声音!为此,我们设置了OnClickListener我们的按钮one。里面只有一种方法,它包含了按钮在 click 时onClick()应该做的指令。

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

要播放声音,我们调用 MediaPlayer 的start()方法。此方法开始播放声音。

在那里,您现在可以在 Android 中单击按钮播放声音!


奖金部分:

正如下面的评论中所述,感谢 Langusten Gustel!,并且按照Android 开发者参考中的建议,调用该release()方法以释放将不再使用的资源非常重要。通常,这是在要播放的声音完成播放后完成的。为此,我们在OnCompletionListener我们的mp like 中添加一个:

mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
    public void onCompletion(MediaPlayer mp) {
        //code
    }
});

onCompletion方法内部,我们像这样释放它

public void onCompletion(MediaPlayer mp) {
    mp.release();
}

显然有更好的方法来实现这一点。例如,您可以将 MediaPlayer 设为类变量并处理其生命周期以及使用它的Fragmentor的生命周期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();
            }
        });
    }
}
于 2013-08-27T07:21:05.470 回答
46

测试和工作 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);
}
于 2015-08-25T14:38:15.147 回答
44

最好的方法是在这里我在 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:媒体播放器因未处理的事件而消失

所以玩安全简单的代码来使用媒体播放器。

要在同一个 Activity/Fragment 中播放多个声音,只需在创建新的媒体播放器时更改 resID

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

玩吧!

玩得开心!

于 2014-07-04T08:26:42.523 回答
11
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();
            }
        });
    }
}
于 2013-08-27T07:18:38.620 回答
7
  • 音频必须放在raw文件夹中,如果不存在,创建一个。
  • raw 文件夹必须在 res 文件夹中
  • 名称中不得包含任何-或特殊字符。

在您的活动中,您需要有一个对象MediaPlayer,在onCreate方法或onclick方法中,您必须初始化MediaPlayer, like MediaPlayer.create(this, R.raw.name_of_your_audio_file),然后您的音频文件准备好通过调用 for 播放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();
            }
        });
}
}
于 2018-08-10T19:12:44.543 回答
6

有一些预定义的声音:SHUTTER_CLICK、FOCUS_COMPLETE、START_VIDEO_RECORDING、STOP_VIDEO_RECORDING。

好的!

MediaActionSound

用于产生与媒体和相机 API 采取的各种操作所产生的声音相匹配的声音的类。文档

像这样使用:

fun playBeepSound() {
    val sound = MediaActionSound()
    sound.play(MediaActionSound.START_VIDEO_RECORDING)
}
于 2019-02-12T18:09:33.777 回答
3
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();
}
});

试试这个,我认为它会工作

于 2017-12-10T18:58:28.177 回答
2
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();

该文件将在按下按钮时运行,希望这有帮助!

于 2018-05-16T15:24:28.917 回答
2

所有这些解决方案“听起来”都不错且合理,但也有一个很大的缺点。如果您的客户下载您的应用程序并反复按下您的按钮会怎样?

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

MediaPlayer几天前,我在课堂上遇到了这个性能问题。

MediaPlayer类保存使用吗?不总是。如果您的声音很短,最好使用SoundPool该类。

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

SoundPool 不像MediaPlayer类那样易于使用,但在性能和可靠性方面有一些很大的好处。

按照此链接了解如何在您的应用程序中使用 SoundPool 类:

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

Youtube:保存解决方案

于 2019-06-25T15:40:47.023 回答
2

而不是按照 DeathRs 的建议重置它:

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

我们可以将 MediaPlayer 重置为开始使用:

if (mp.isPlaying()) {
       mp.seekTo(0)
}
于 2019-07-24T13:58:23.777 回答
2

边缘情况: 以上每个答案几乎都是正确的,但我陷入了边缘情况。如果任何用户在几秒钟内多次随机单击该按钮,则在播放一些声音后它不再响应。

原因:初始化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;
        }
    }

}
于 2020-08-17T05:25:33.207 回答