android之音频的播放和录制(MediaPlayer,SoundPool,MediaRecorder)

1、音频播放

1、播放本地音乐

public class MainActivity extends Activity implements View.OnClickListener {

private Button mButton;
    private SeekBar mSeekbar;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mButton = (Button) findViewById(R.id.button);
        mSeekbar = (SeekBar) findViewById(R.id.seekBar);
        mButton.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        MediaPlayer player = new MediaPlayer();
        player.reset();
        Log.d("", "" + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).getAbsolutePath());
        File musicDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC);//找到sdcard下music文件夹的文件
        File[] musics = musicDir.listFiles();
        try {
            player.setDataSource(musics[0].getAbsolutePath());//播放第一个文件
            player.prepare();
            player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    mp.start();
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2、播放提示音
注意:不能直接将pool.play(id, 1, 1, 0, -1, 1);写在一个方法中然后在onCreate中调用,因为这个过程需要时间,这样写就无法播放。正确的写法,应该是将pool.play(id, 1, 1, 0, -1, 1);写在onCreat中。如下:

public class MainActivity extends Activity {
    private Button mButton;
    private int id;
    private SoundPool pool = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mButton = (Button) findViewById(R.id.button);
        id = init();
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                pool.play(id, 1, 1, 0, -1, 1);
            }
        });
    }

    private int init() {
        if (Build.VERSION.SDK_INT > 21) {
            SoundPool.Builder builder = new SoundPool.Builder();
            builder.setMaxStreams(2);
            AudioAttributes.Builder attrBuilder = new AudioAttributes.Builder();
            attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC);
            builder.setAudioAttributes(attrBuilder.build());
            pool = builder.build();
        } else {
            pool = new SoundPool(2, AudioManager.STREAM_MUSIC, 1);
        }
        return pool.load(getApplicationContext(), R.raw.outgoing, 1);
    }

}

2、音频录制

public class MediaRecorderActivity extends AppCompatActivity implements View.OnClickListener {
    private Button mButtonStart;
    private Button mButtonStop;
    private MediaRecorder mediaRecorder;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mButtonStart = (Button) findViewById(R.id.button_start);
        mButtonStop = (Button) findViewById(R.id.button_stop);
        mButtonStart.setOnClickListener(this);
        mButtonStop.setOnClickListener(this);
    }


    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button_start:
                mediaRecorder = new MediaRecorder();
                mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//设置声音来源,MIC是手机上的麦克风
                mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//代表输出文件的格式。
                // 该语句必须在setAudioSource之后,在prepare之前。
                //OutputFormat内部类,定义了音频输出的格式,主要包含MPEG_4、THREE_GPP、RAW_AMR……等
                mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//设置音频的编码,
                // AudioEncoder内部类详细定义了两种编码:AudioEncoder.DEFAULT、AudioEncoder.AMR_NB
                mediaRecorder.setOutputFile(Environment.getExternalStorageDirectory() + "/myrecord.3gp");// 设置录音之后,保存音频文件的位置
                try {
                    mediaRecorder.prepare();
                    mediaRecorder.start();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                break;
            case R.id.button_stop:
                mediaRecorder.stop();
                mediaRecorder.reset();// 重置录音 ,会重置到setAudioSource这一步
                mediaRecorder.release();//解除对录音资源的占用
                break;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值