天天看點

Android動态擷取權限(話筒以及存儲),錄音并儲存為MP3功能實作,附GitHub位址

Android錄音并儲存為MP3

這幾天要實作一個在Android6.0+的環境中的錄音功能,總結出來大概有這麼幾個問題:權限的動态開啟(就因為這個愁死我了),聲音的錄制,流的MP3轉存。

首先說一下權限動态開啟:

需要先定義一個String數組來存儲需要開啟的權限

private static String[] PERMISSIONS_STORAGE = {android.Manifest.permission.READ_EXTERNAL_STORAGE,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
android.Manifest.permission.RECORD_AUDIO};
           

然後,定義一個請求權限代碼

private static int REQUEST_PERMISSION_CODE = 3;
           

然後寫一個方法,因為我是封裝了一個類,是以還需要傳入一個Activity來調用

public void open(Activity obj){
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
            for (int i = 0 ; i < PERMISSIONS_STORAGE.length ; i++){
                if (ActivityCompat.checkSelfPermission(obj,
                        PERMISSIONS_STORAGE[i])!= PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(obj, PERMISSIONS_STORAGE, REQUEST_PERMISSION_CODE);
                }
            }
        }
    }
           

在主函數中直接調用這個方法,就可以實作動态擷取權限了,這裡開啟的是讀寫權限和話筒權限,如果需要其他的可以自行添加。

CALENDAR	月曆

CAMERA	相機

CONTACTS	聯系人

LOCATION	定位

MICROPHONE	麥克相關,比如錄音

PHONE	手機狀态

SENSORS	傳感器

SMS	短信

STORAGE	存儲權限
           

這些是其中一些可調用權限。

接下來說一下最複雜的一部分,就是錄音以及存儲:

當然,這裡我還是封裝成了一個類,為了後期其他項目友善調用。

首先建立所要用到的變量

MediaRecorder recorder;
    File audioFile; //錄音儲存的檔案
    boolean isRecoding=false;// true 表示正在錄音
    //這裡接收傳遞的Activity,如果直接寫在Activity中則不需要寫這一個
    Activity activity;
           

傳遞Activity

public void setActivity(Activity activity){
    this.activity = activity;
}
           

初始化MediaRecorder

public void init(){
      recorder = new MediaRecorder();
      recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//設定播放源 麥克風
      recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); //設定輸入格式 3gp
      recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); //設定編碼 AMR
  }
           

接下來就是錄音功能的實作:

public void recod(){
//這裡為檔案儲存路徑
        File path = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+ "/MediaRecorderTest");
        init();
        if(!path.exists())
        {
            path.mkdirs();
        }

        try {
        //這個地方寫檔案名,可以利用時間來儲存為不同的檔案名
            audioFile=new File(path,"test.MP3");
            if(audioFile.exists())
            {
                audioFile.delete();
            }
            audioFile.createNewFile();//建立檔案

        } catch (Exception e) {
            throw new RuntimeException("Couldn't create recording audio file", e);
        }

        recorder.setOutputFile(audioFile.getAbsolutePath()); 

        try {
            recorder.prepare();
        } catch (IllegalStateException e) {
            throw new RuntimeException("IllegalStateException on MediaRecorder.prepare", e);
        } catch (IOException e) {
            throw new RuntimeException("IOException on MediaRecorder.prepare", e);
        }
        isRecoding=true;
        recorder.start();
    }
           

然後封裝方法,首先是開始錄音,這個比較簡單,調用之前的方法就可以

public void startin(){
        Toast.makeText(activity,"開始錄音",Toast.LENGTH_SHORT).show();
        this.recod();
    }
           

最後是停止錄音,這個比較費勁,之前因為某些原因,需要點選兩次,将程式點崩潰才能儲存,然後利用trycatch和初始化,保證一次成功

public void stopin(){
        if(isRecoding)
        {
            Toast.makeText(activity,"停止錄音",Toast.LENGTH_SHORT).show();
            if (recorder != null){
                try {
                    recorder.stop();
                } catch (IllegalStateException e) {
                    // TODO 如果目前java狀态和jni裡面的狀态不一緻,
                    //e.printStackTrace();
                    recorder = null;
                    recorder = new MediaRecorder();
                }
                recorder.release();
                recorder = null;
            }
        }
    }
           

千萬不要忘記在AndroidMainfest.xml中加入權限

<uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
           

最後是布局檔案

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#fff"
    android:gravity="center">

    <Button
        android:text="開始錄音"
        android:id="@+id/StartRecording"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <Button
        android:text="停止錄音"
        android:id="@+id/StopRecording"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <Button
        android:id="@+id/playAui"
        android:text="測試按鈕"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

           

測試按鈕暫時沒寫功能,留作測試用

GitHub位址:https://github.com/Binoculus/MediaRecorder-Save-Mp3

如果對您有幫助的話,點個贊和Star吧,非常感謝。

QQ:1678949488