【问题标题】:android - how to make a button click play a sound file every time it been pressed?android - 每次按下按钮时如何让按钮点击播放声音文件?
【发布时间】:2013-10-28 04:33:16
【问题描述】:

我打开了一个新项目-

现在我想做的是—— 通过按下按钮,我想要播放 mp3 文件 - 而且每次按下按钮时,声音文件都会再次从头开始播放 - 所以假设 mp3 的长度为 10 秒,而我按下按钮,它正在播放,4秒后我再次按下按钮,声音将再次播放。

现在我想知道的是—— 1- 我应该把 mp3 文件放在哪里?

2-我必须添加什么代码才能在按下按钮时播放 mp3 文件(我们称之为 mp3 文件 click_sound.mp3)?

3- 我需要在代码中添加什么,以便每次按下按钮时都会再次播放声音?

这是 MainActivity.java 的代码 -

package com.example.test1;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

这是activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/play" />

</RelativeLayout>

【问题讨论】:

标签: android audio


【解决方案1】:
  1. 你应该把 mp3 文件放在 /assets 文件夹中。

  2. 将此代码放在onCreate()方法中setContentView()之后

    final MediaPlayer mp = new MediaPlayer();
    Button b = (Button) findViewById(R.id.button1); 
    
    b.setOnClickListener(new OnClickListener() {
    
        @Override
        public void onClick(View v) {
    
            if(mp.isPlaying())
            {  
                mp.stop();
            } 
    
            try {
                mp.reset();
                AssetFileDescriptor afd;
                afd = getAssets().openFd("AudioFile.mp3");
                mp.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
                mp.prepare();
                mp.start();
            } catch (IllegalStateException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
    
    
        }
    });
    

    3.每按一次按钮,就会再次播放声音。您不必为此编写任何额外的代码。

注意 AudioFile.mp3 是 /assets 文件夹中 mp3 文件的名称

希望这个答案有帮助:)

【讨论】:

  • 由于某种原因,setOnClickListener AND OnClickListener() 以及 onClick(View v) - 都是错误 - 知道为什么吗?
  • 点击那个红色的错误符号。它会给你建议。在该列表中选择Import OnClickListener。或者将光标放在b.setOnClickListener(new OnClickListener() 行上,然后在windows、linux 中按ctrl+1,在mac 中按cmd+1。它会给你建议。在该列表中选择Import OnClickListener
  • 首先,谢谢你真的有效。但似乎当我按下按钮第二次时 - 声音不会停止,它只是在第一次播放声音时再次播放文件 - 你确定没有必要添加一些东西到代码?
  • 已编辑代码...现在,如果再次按下按钮时正在播放声音,它会停止声音。检查这是否有效:)
  • 它告诉我所有的 mp 都是错误的(不包括新 MediaPlayer 中的第一个 mp) - 所以它给我的建议是将 final 添加到 MediaPlayer mp = new MediaPlayer() ;行 - 这就是我所做的 - 所有错误都消失了 - 但是当我尝试代码时 - 在第一次点击时我听到了声音,但是通过第二次点击声音停止 - 但在它之后任何其他点击按钮都不会播放声音。
【解决方案2】:

如果您真的必须以编程方式调用单击,因为视图没有自己的声音,我会这样解决,它是最简单的解决方案和单线器

view.playSoundEffect(SoundEffectConstants.CLICK);

非常简单且有效,如果你想让布局播放声音,你需要放

android:soundEffectsEnabled="true"

到布局

【讨论】:

    【解决方案3】:

    我认为这正是您想要的:

    public class MainActivity extends Activity {
        String tag;
        static MediaPlayer mp;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            tag=getPackageName();
        }
    
        @Override
        protected void onResume() {
            // TODO Auto-generated method stub
            super.onResume();
            mp = new MediaPlayer();
            Button b = (Button) findViewById(R.id.button1); 
    
             b.setOnClickListener(new OnClickListener() {
    
                    @Override
                    public void onClick(View v) {
                       // MediaPlayer mp = new MediaPlayer();
    
                        if(!mp.isPlaying())
                        {
                            mp= new MediaPlayer();
                        }
                        try {
                            AssetFileDescriptor afd = getAssets().openFd("AudioFile.mp3");
                            mp.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
                            mp.prepare();
                            mp.start();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
    
                    }
                });
    
            /*b.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View v) {
    
                    if(mp.isPlaying())
                    {  
                        Log.e(tag,"mp is playing");
    
                        mp.stop();
                        mp.reset();
                        //mp.start();
                    } 
                    try {
    
                        AssetFileDescriptor afd;
                        afd = getAssets().openFd("AudioFile.mp3");
                        mp.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
                        mp.prepare();
                        mp.start();
                      //  mp.release();
                    } catch (IllegalStateException e) {
                        Log.e(tag, e.toString());
                        //e.printStackTrace();
                    } catch (IOException e) {
                        Log.e(tag, e.toString());
    
                        //e.printStackTrace();
                    }
    
    
    
                }
            });
    
            mp.setOnPreparedListener(new OnPreparedListener() {
    
                @Override
                public void onPrepared(MediaPlayer mp) {
                    // TODO Auto-generated method stub
                mp.start(); 
                }
            });*/
    
        }
    
    
    
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // Handle action bar item clicks here. The action bar will
            // automatically handle clicks on the Home/Up button, so long
            // as you specify a parent activity in AndroidManifest.xml.
            int id = item.getItemId();
            if (id == R.id.action_settings) {
                return true;
            }
            return super.onOptionsItemSelected(item);
        }
    }
    

    【讨论】:

    • 查看我对上述帖子的评论。抛出错误的正确答案是找出原因。不因缺乏了解而抹杀对象。原始代码的问题是必须在状态 128(PlaybackComplete)中调用 mp.reset() 才能进入状态 Idle 但您无法使用该代码到达那里,因为 PlaybackComplete 不是 isPlaying()
    【解决方案4】:

    我解决了这个问题:

    public void onClick(View v) {
        sound.start();
    
        if (sound.isPlaying()) {
            sound.seekTo(0);
            sound.start();
        }
    }
    

    【讨论】:

      【解决方案5】:

      希望这些步骤将帮助您继续前进..

      1.将你的mp3文件放在row文件夹下(如果不存在创建一个->右键单击项目->新建->创建文件夹)

      2.R&D ongoogle先播放mp3(媒体播放器)

      3.单击按钮加载该特定文件(通过将 onclick 侦听器设置为按钮)

      祝你好运

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-16
      • 2013-08-29
      • 2022-01-14
      • 2014-11-02
      • 2015-05-01
      相关资源
      最近更新 更多