第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

全部開(kāi)發(fā)者教程

Android 入門(mén)教程

菜單類(lèi)控件
菜單:Menu
并發(fā)編程
多線程

音頻錄制:MediaRecord

在第 57 節(jié)我們使用 MediaPlayer 實(shí)現(xiàn)了一個(gè) mp3 播放器,除了播放 Android 還提供了 MediaRecorder 用于錄音。Android 設(shè)備基本都會(huì)有一個(gè)麥克風(fēng),通過(guò) MediaRecorder 可以打開(kāi)麥克風(fēng)進(jìn)行語(yǔ)音采集,這一節(jié)我們就來(lái)學(xué)習(xí)如何在 Android 系統(tǒng)上實(shí)現(xiàn)一個(gè)錄音功能。

1. MediaRecorder 常用接口

  • setAudioSource():
    設(shè)置錄制的音頻源
  • setVideoSource():
    設(shè)置錄制的視頻源
  • setOutputFormat():
    設(shè)置輸出格式
  • setAudioEncoder():
    設(shè)置音頻編碼器
  • setOutputFile():
    配置錄制的音頻存儲(chǔ)文件路徑
  • stop():
    停止錄制
  • release():
    釋放 MediaRecorder 實(shí)例,回收其所占資源

2. MediaRecorder 的使用步驟

  1. 創(chuàng)建 MediaRecorder
    直接通過(guò)無(wú)參構(gòu)造器創(chuàng)建即可:
MediaRecorder myAudioRecorder = new MediaRecorder();
  1. 配置錄音參數(shù)
    創(chuàng)建好之后,再對(duì) MediaRecorder 實(shí)例進(jìn)行參數(shù)配置,配置項(xiàng)有很多,一般需要設(shè)置音頻輸入源、音頻輸出格式、音頻編碼方式以及輸出文件目錄,如下:
myAudioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
myAudioRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
myAudioRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
myAudioRecorder.setOutputFile(outputFile);
  1. 開(kāi)始錄音
    在確定了錄音配置和輸出目錄之后,我們就可以調(diào)用一下兩個(gè)方法開(kāi)始錄音了:
myAudioRecorder.prepare();
myAudioRecorder.start();
  1. 停止錄音
    錄音結(jié)束調(diào)用stop()停止錄制,如果不再使用還要記得調(diào)用release()釋放 MediaRecorder 所占用的資源

3. 錄音示例

本節(jié)使用 MediaRecorder 實(shí)現(xiàn)一個(gè)錄音機(jī):

3.1 MediaRecorder 控制邏輯

作為一個(gè)完整的錄音功能,當(dāng)然在錄音結(jié)束之后也得要能回放錄音。所以整個(gè)的控制要分為錄音控制和播放控制,我們按照上一小節(jié)講述的步驟用 MediaRecorder 完成錄音,然后調(diào)用 MediaPlayer 來(lái)完成錄音回放:


package com.emercy.myapplication;

import android.app.Activity;
import android.content.pm.PackageManager;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.io.IOException;
import java.util.Random;

import static android.Manifest.permission.RECORD_AUDIO;
import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;

public class MainActivity extends Activity {

    Button buttonStart, buttonStop, buttonPlayLastRecordAudio,
            buttonStopPlayingRecording;
    String AudioSavePathInDevice = null;
    MediaRecorder mediaRecorder;
    Random random;
    String RandomAudioFileName = "emercy";
    public static final int RequestPermissionCode = 1;
    MediaPlayer mediaPlayer;

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

        buttonStart = findViewById(R.id.button);
        buttonStop = findViewById(R.id.button2);
        buttonPlayLastRecordAudio = findViewById(R.id.button3);
        buttonStopPlayingRecording = findViewById(R.id.button4);

        buttonStop.setEnabled(false);
        buttonPlayLastRecordAudio.setEnabled(false);
        buttonStopPlayingRecording.setEnabled(false);

        random = new Random();

        buttonStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                if (checkPermission()) {

                    AudioSavePathInDevice =
                            Environment.getExternalStorageDirectory().getAbsolutePath() + "/" +
                                    CreateRandomAudioFileName(5) + "AudioRecording.3gp";

                    MediaRecorderReady();

                    try {
                        mediaRecorder.prepare();
                        mediaRecorder.start();
                    } catch (IllegalStateException | IOException e) {
                        e.printStackTrace();
                    }

                    buttonStart.setEnabled(false);
                    buttonStop.setEnabled(true);

                    Toast.makeText(MainActivity.this, "Recording started",
                            Toast.LENGTH_LONG).show();
                } else {
                    requestPermission();
                }

            }
        });

        buttonStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mediaRecorder.stop();
                buttonStop.setEnabled(false);
                buttonPlayLastRecordAudio.setEnabled(true);
                buttonStart.setEnabled(true);
                buttonStopPlayingRecording.setEnabled(false);

                Toast.makeText(MainActivity.this, "Recording Completed", Toast.LENGTH_LONG).show();
            }
        });

        buttonPlayLastRecordAudio.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) throws IllegalArgumentException,
                    SecurityException, IllegalStateException {

                buttonStop.setEnabled(false);
                buttonStart.setEnabled(false);
                buttonStopPlayingRecording.setEnabled(true);

                mediaPlayer = new MediaPlayer();
                try {
                    mediaPlayer.setDataSource(AudioSavePathInDevice);
                    mediaPlayer.prepare();
                } catch (IOException e) {
                    e.printStackTrace();
                }

                mediaPlayer.start();
                Toast.makeText(MainActivity.this, "錄音完畢", Toast.LENGTH_LONG).show();
            }
        });

        buttonStopPlayingRecording.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                buttonStop.setEnabled(false);
                buttonStart.setEnabled(true);
                buttonStopPlayingRecording.setEnabled(false);
                buttonPlayLastRecordAudio.setEnabled(true);

                if (mediaPlayer != null) {
                    mediaPlayer.stop();
                    mediaPlayer.release();
                    MediaRecorderReady();
                }
            }
        });

    }

    public void MediaRecorderReady() {
        mediaRecorder = new MediaRecorder();
        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        mediaRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
        mediaRecorder.setOutputFile(AudioSavePathInDevice);
    }

    public String CreateRandomAudioFileName(int string) {
        StringBuilder stringBuilder = new StringBuilder(string);
        int i = 0;
        while (i < string) {
            stringBuilder.append(RandomAudioFileName.
                    charAt(random.nextInt(RandomAudioFileName.length())));

            i++;
        }
        return stringBuilder.toString();
    }

    private void requestPermission() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions(new String[]{WRITE_EXTERNAL_STORAGE, RECORD_AUDIO}, RequestPermissionCode);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (requestCode == RequestPermissionCode) {
            if (grantResults.length > 0) {
                boolean StoragePermission = grantResults[0] ==
                        PackageManager.PERMISSION_GRANTED;
                boolean RecordPermission = grantResults[1] ==
                        PackageManager.PERMISSION_GRANTED;

                if (StoragePermission && RecordPermission) {
                    Toast.makeText(MainActivity.this, "Permission Granted", Toast.LENGTH_LONG).show();
                } else {
                    Toast.makeText(MainActivity.this, "Permission Denied", Toast.LENGTH_LONG).show();
                }
            }
        }
    }

    public boolean checkPermission() {
        int storagePermission = 0;
        int recordPermission = 0;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
            storagePermission = checkSelfPermission(WRITE_EXTERNAL_STORAGE);
            recordPermission = checkSelfPermission(RECORD_AUDIO);
        }

        return storagePermission == PackageManager.PERMISSION_GRANTED &&
                recordPermission == PackageManager.PERMISSION_GRANTED;
    }
}

和拍照一樣,錄音也需要獲取權(quán)限(注意 Android 6.0 以上還需要?jiǎng)討B(tài)獲取權(quán)限),除此之外只需要按照步驟進(jìn)行錄音就可以實(shí)現(xiàn)功能了。

3.2 錄音布局

<?xml version="1.0" encoding="utf-8"?>
<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:padding="30dp">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_marginTop="37dp"
        android:text="錄音" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/button"
        android:layout_centerHorizontal="true"
        android:text="停止" />

    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/button2"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:text="回放" />

    <Button
        android:id="@+id/button4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/button2"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="10dp"
        android:text="結(jié)束回放" />
</RelativeLayout>

對(duì)于兩大功能:“錄音”和“回放”,各提供兩個(gè)按鍵控制,分別對(duì)應(yīng)開(kāi)始和結(jié)束。

最終編譯效果:

mediarecorder

4. 小結(jié)

MediaRecorder 很多時(shí)候都是配合 MediaPlayer 或者其他播放器一起使用,而兩者之間也有很多相似之處。當(dāng)然本節(jié)提到的只是最基本的錄音及音頻輸出功能,如果需要進(jìn)一步研究音視頻相關(guān)的內(nèi)容就得深入到底層編解碼原理。不過(guò)對(duì)于大多數(shù)非專(zhuān)業(yè)音視頻制作 App 而言已經(jīng)足夠。