1. 程式人生 > >android錄音實現

android錄音實現

效果圖:


一、實現錄音的 Service 關鍵程式碼:

// 開始錄音
    public void startRecording() {
        setFileNameAndPath();
        mRecorder = new MediaRecorder();
        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); //錄音檔案儲存的格式,這裡儲存為 mp4
        mRecorder.setOutputFile(mFilePath); // 設定錄音檔案的儲存路徑
        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
        mRecorder.setAudioChannels(1);
        // 設定錄音檔案的清晰度
        mRecorder.setAudioSamplingRate(44100);
        mRecorder.setAudioEncodingBitRate(192000);
        try {
            mRecorder.prepare();
            mRecorder.start();
            mStartingTimeMillis = System.currentTimeMillis();
        } catch (IOException e) {
            Log.e(LOG_TAG, "prepare() failed");
        }
    }
    // 設定錄音檔案的名字和儲存路徑
    public void setFileNameAndPath() {
        File f;
        do {
            count++;
            mFileName = getString(R.string.default_file_name)
                    + "_" + (System.currentTimeMillis()) + ".mp4";
            mFilePath = Environment.getExternalStorageDirectory().getAbsolutePath();
            mFilePath += "/SoundRecorder/" + mFileName;
            f = new File(mFilePath);
        } while (f.exists() && !f.isDirectory());
    }
    // 停止錄音
    public void stopRecording() {
        mRecorder.stop();
        mElapsedMillis = (System.currentTimeMillis() - mStartingTimeMillis);
        mRecorder.release();
        getSharedPreferences("sp_name_audio", MODE_PRIVATE)
                .edit()
                .putString("audio_path", mFilePath)
                .putLong("elpased", mElapsedMillis)
                .apply();
        if (mIncrementTimerTask != null) {
            mIncrementTimerTask.cancel();
            mIncrementTimerTask = null;
        }
        mRecorder = null;
    }

二、顯示錄音介面的 RecordAudioDialogFragment

使用者進行的時候,總不能讓 App 跳轉到另外一個介面吧,這樣使用者體驗並不是很好,比較好的方法是顯示一個對話方塊,讓使用者進行操作,既然要用對話方塊,必然離不開 DialogFragment

在 RecordAudioDialogFragment 有一個 newInstance(int maxTime) 的靜態方法供外部呼叫,如果想設定錄音的最大時長,直接傳引數進去就行了。

好的,敲黑板,重點來了,其實這個對話方塊的重點部分就是在 onCreateDialog()中,我們先載入了我們自定義的對話方塊的佈局,當點選錄音的按鈕的時候,先進行相關許可權的申請,這裡有個巨坑,錄音許可權 android.permission.RECORD_AUDIO 在不久前還是普通許可權的,不知道什麼時候突然變成了危險許可權,需要我們進行申請,Google 真是會玩。

public Dialog onCreateDialog(Bundle savedInstanceState) {
        Dialog dialog = super.onCreateDialog(savedInstanceState);
        final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        View view = getActivity().getLayoutInflater().inflate(R.layout.fragment_record_audio, null);
        mFabRecord.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE)
                        != PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(getActivity()
                            , new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO}, 1);
                }else {
                    onRecord(mStartRecording);
                    mStartRecording = !mStartRecording;
                }
            }
        });
        builder.setView(view);
        return builder.create();
    }

三、播放錄音的 PlaybackDialogFragment

其實,如果只是錄音這一塊的話,寫個 MediaPlayer 就可以了,然而還要寫播放的時間進度,以及顯示一個稍微好看點的進度條,我能怎樣,我也很煩啊。

外部呼叫這個對話方塊的時候,只需要傳入一個包含錄音檔案資訊的 RecordingItem,因為包含的資訊比較多,所以最好將 RecordingItem 進行序列化。

public static PlaybackDialogFragment newInstance(RecordingItem item) {
        PlaybackDialogFragment fragment = new PlaybackDialogFragment();
        Bundle bundle = new Bundle();
        bundle.putParcelable(ARG_ITEM, item);
        fragment.setArguments(b);
        return fragment;
    }
好,重點又來了,來看看 onCreateDialog() 方法,在載入了佈局之後,給 mSeekBar 設定監聽,mSeekBar 是一個顯示進度條的控制元件,當開始播放錄音時候,將錄音檔案的時長,設定進 mSeekBar 裡面,播放錄音的同時,執行 mSeekBar,通過監聽 mSeekBar 的進度,重新整理顯示的播放進度。
public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        View view = getActivity().getLayoutInflater().inflate(R.layout.fragment_media_playback, null);
        mFileLengthTextView.setText(String.valueOf(mFileLength));
        mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                if(mMediaPlayer != null && fromUser) {
                    mMediaPlayer.seekTo(progress);
                    mHandler.removeCallbacks(mRunnable);
                    long minutes = TimeUnit.MILLISECONDS.toMinutes(mMediaPlayer.getCurrentPosition());
                    long seconds = TimeUnit.MILLISECONDS.toSeconds(mMediaPlayer.getCurrentPosition())
                            - TimeUnit.MINUTES.toSeconds(minutes);
                    mCurrentProgressTextView.setText(String.format("%02d:%02d", minutes,seconds));
                    updateSeekBar();
                } else if (mMediaPlayer == null && fromUser) {
                    prepareMediaPlayerFromPoint(progress);
                    updateSeekBar();
                }
            }
        });
        mPlayButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onPlay(isPlaying);
                isPlaying = !isPlaying;
            }
        });
        mFileLengthTextView.setText(String.format("%02d:%02d", minutes,seconds));
        builder.setView(view);
        return builder.create();
    }

當點選播放錄音的按鈕之後,會呼叫 onPlay() 方法,然後根據 isPlaying(標識當前是否播放錄音)的值,來呼叫不同的方法
 private void onPlay(boolean isPlaying){
        if (!isPlaying) {
            //currently MediaPlayer is not playing audio
            if(mMediaPlayer == null) {
                startPlaying(); //start from beginning
            } 
        } else {
            pausePlaying();
        }
    }

我們最關心的,莫過於 startPlaying() 這個方法,這個方法便是來開啟播放錄音的,我們首先將外部傳入的有關的錄音資訊,設定給 MediaPlayer,然後開始呼叫 mMediaPlayer.start() 進行錄音的播放,然後呼叫 updateSeekbar() 實時更新進度條的內容。當 MediaPlayer 的內容播放完成後,呼叫 stopPlaying() 方法,關閉 mMediaPlayer。。。。

相關推薦

android錄音實現

效果圖: 一、實現錄音的 Service 關鍵程式碼: // 開始錄音 public void startRecording() { setFileNameAndPath(); mRecorder = new MediaRecord

Android 錄音實現追蹤(Android 7.1)

未完待續 最初的夢想 哈哈哈哈哈哈,我就是想了解下Android上錄音是怎麼實現的,寫了個簡單的錄音demo,一路跟下去,瞅瞅這傢伙都幹了些啥。基於Android 7.1, s905x 平臺。 冰山上面的部分 按照官方我Android大文件

如何使Android錄音實現內錄功能

背景 之前在做直播的時候需要使用到內錄功能,比如經常看到遊戲主播在直播玩遊戲,遊戲的聲音不是通過MIC錄製的,而是內錄完成的。故在此記錄一下。 相信大家都很熟悉Android如果錄音的了: int frequency = 44100; int audioEncod

Android 錄音實現方法、仿微信語音、麥克風錄音、傳送語音

效果圖(注!由於使用的模擬器錄製,所以圖片中的錄音時候話筒上下波動比較小,手機上正常!): 使用方法: 錄音工具類:AudioRecoderUtils.java,程式碼如下: public class AudioRecoderUtils { //檔案路徑

Android 錄音實現

     在模擬器中無法利用電腦的音效卡錄音,因此這個功能必須在真機上測試。錄音功能需要使用android.media.MediaRecorder來完成。使用MediaRecorder錄音需要通過如下6個步驟完成: (1)設定音訊來源(一般為麥克風)。 (2)設定音訊輸出格

android 錄音功能的實現

廢話說直接上: 我這裡使用的是MediaRecorder進行錄製的音訊。 1、先指定一個儲存音訊檔案的路徑資料夾。 2、建立音訊檔案的名稱(這裡的檔名稱儘量不要重複)。 /*** 隨機生成檔名稱* * @return*/private String generateFile

Android錄音功能Android Studio實現

在Android官網上給出了MediaRecorder類的用法,錄製音訊的例子如下: MediaRecorder recorder =newMediaRecorder(); //設定音訊資源的來源包括:麥克風,通話上行,通話下行等;程式中設定音訊來源為麥克風  rec

android 呼叫系統自帶錄音實現,語音錄製與播放

相關許可權:<uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission> <uses-permission android:name="and

Android實現陰影效果

sta 技術 wid 語言 mat floating 大表 ado sch 在Android L推出後,Google提出了全新的設計語言:材質設計。其中很重要的一點就是陰影效果的使用,你可以為每一個View設置一個elevation值,相當於除了x、y之外的z值,z值決定

gradle打包android實現外部導入簽名文件、多渠道打包、導入ant腳本)

gradle打包 tree clu download csdn ssp pes 基礎 net 近期一直在做android自己主動打包,之前已經完畢了用純命令行的形式打包、原生態ant腳本打包。和基於android的SDK的打包。而且實現了多渠道打包,後來同

Android 封裝實現各種樣式對話框

dismiss class demo position sdn 是否 ets override listener 先上圖 實現代碼 package com.jock.alertdialog; import android.app.Activity; impor

Android簡單實現將手機圖片上傳到server中

sdk etc mov 創建 ast bmi 以及 lena ews 在本例中。將會簡單的實現安卓手機將圖片上傳到server中。本例使用到了 server端:PHP+APACHE 客戶端:JAVA 先簡單實現一下server端的上傳並測試上傳

android實現毛筆效果(View 中畫圖)

方法 繪畫 object android中 validate 滑動 一個 lineto 效果 近期有一個項目設計一個APP實現通過觸摸屏實現毛筆寫字效果。傳統的繪畫板程序直接通過Path的moveTo和LineTo便可實現簡單的線條繪畫程序。然而要達到毛筆的筆鋒效果

android:Notification實現狀態欄的通知

generate file widget flash track click 短消息 img example 在使用手機時,當有未接來電或者新短消息時,手機會給出響應的提示信息,這些提示信息一般會顯示到手機屏幕的狀態欄上。 Android也提供了用於處理這些信息的

Android ViewPager實現多個圖片水平滾動

oncreate iss block 如果 del ner ide extends 大小 1.示意圖 2.實現分析 (1).xml配置 <!-- 配置container和pager的clipChildre

Android MarsDaemon實現進程及Service常駐

小米 target 輕量 sda 定義 win 同進程 service 自己的 前段時間。就討論過關於怎樣讓Service常駐於內存而不被殺死,最後的結論就是使用JNI實現守護進程,可是不得不說的是,在沒有改動系統源代碼的情況下,想真正實現殺不死服務,是一件非常難的

Android直播實現 Android端推流、播放

size input 準備 預覽 不必要 targe height 不出 oar 最近想實現一個Android直播,但是對於這方面的資料都比較零碎,一開始是打算用ffmpeg來實現編碼推流,在搜集資料期間,找到了幾個強大的開源庫,直接避免了jni的代碼,集成後只用少量的ja

Android實現線程異步小技巧

使用 msg xtend util rri wsh ride 執行 java 方式不止一種,這裏使用的是Timer類,創建一個定時器。我們經常需要獲得移動設備端口的顯示屏信息,但是onCreate()方法執行的時候,OnShow()方法不一定執行了,也就是說,在執行Oncr

Android快速實現上傳項目到Github

alt+ 紅色 選擇 index.php 就會 打開 ads 倉庫 http 本文為skylinelin原創,轉載請註明出處! 一、簡介 現在在網上瀏覽關於Git的文章,基本上都是使用命令行(Git Bash),命令行效率是很高的,但是有一定的復雜性,現在我們看如何用A

【轉】 Android路由實現

~~ 下載 bin 一個 setup 自己的路 rul 簡單 sync 本文轉自: http://blog.csdn.net/qibin0506/article/details/53373412 前幾個月有幸參加了CSDN組織的MDCC移動開發者大會, 一天下來我最大的收獲