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