A period of time did not watch the video, last night smoked a little time, and saw the next big God video tutorial, and took time to write a study record. The code is basically the same as the teacher said, and there are many similar blogs on the internet. I just wrote it in the Androidstudio environment.
--The main interface code--
public class Mainactivity extends activity {private ListView Mlistview;
Private arrayadapter<recorder> Madapter;
Private list<recorder> Mdatas = new arraylist<recorder> ();
Private Audiorecorderbutton Maudiorecorderbutton;
Private View Animview;
@Override protected void OnCreate (Bundle savedinstancestate) {super.oncreate (savedinstancestate);
Setcontentview (R.layout.activity_main);
Mlistview = (ListView) Findviewbyid (R.id.id_listview);
Maudiorecorderbutton = (Audiorecorderbutton) Findviewbyid (R.id.id_recorder_button); Maudiorecorderbutton.setfinishrecordercallback (New Audiorecorderbutton.audiofinishrecordercallback () {public void
OnFinish (float seconds, String FilePath) {Recorder recorder = new recorder (seconds, filePath);
Mdatas.add (recorder);
Update Data madapter.notifydatasetchanged ();
Set Position mlistview.setselection (Mdatas.size ()-1);
}
});
Madapter = new Recoderadapter (this, mdatas); Mlistview.setadapter (Madapter); ListView Item Click event Mlistview.setonitemclicklistener (New Onitemclicklistener () {public void Onitemclick (Adapterview <?> arg0, view view, int position, long ID {//Sound playback animation if (Animview!= null) {Animview.setbackgroundr
Esource (R.DRAWABLE.ADJ);
Animview = null;
} Animview = View.findviewbyid (R.id.id_recoder_anim);
Animview.setbackgroundresource (R.drawable.play_anim);
animationdrawable animation = (animationdrawable) animview.getbackground ();
Animation.start (); Play the recording Mediaplayermanager.playsound (Mdatas.get (position). FilePath, New Mediaplayer.oncompletionlistener () {Pub
LIC void Oncompletion (MediaPlayer MP) {///after playback is complete modify the picture Animview.setbackgroundresource (R.DRAWABLE.ADJ);
}
});
}
});
} @Override protected void OnPause () {super.onpause ();
Mediaplayermanager.pause ();
} @Override protected void Onresume () {super.onresume ();
Mediaplayermanager.resume (); } @Override Protectedvoid OnDestroy () {Super.ondestroy ();
Mediaplayermanager.release ();
}
-Customize button ——-
/** * @param * @author LDM * @description Custom button * @time 2016/6/25 9:26/public class Audiorecorderbutton Exten
DS button {//button normal state (default) private static final int state_normal = 1;
Recording status private static final int state_recording = 2;
Recording cancellation State private static final int state_cancel = 3;
Record current state private int mcurrentstate = State_normal;
Whether to start recording flag Private Boolean isrecording = false;
Determine whether to remove the private static final int distance_y_cancel = 50 by sliding the distance on the button;
dialog box management tool class private Dialogmanager mdialogmanager;
Recording management tool class private Audiomanager maudiomanager;
Record recording time private float mtime;
Whether to trigger Longclick private Boolean mready;
Recording preparation private static final int msg_audio_prepared = 0x110;
Volume changes private static final int msg_voice_changed = 0x111;
Cancel the prompt dialog box private static final int msg_dialog_dimiss = 0x112; /** * @description Get volume size thread * @author LDM * @time 2016/6/25 9:30 * @param * * Private Runnable MGETVOICELEVELRU
nnable = new Runnable () { public void Run () {while (isrecording) {//judge is recording try {thread.sleep (100); Mtime + + 0.1f;//recording time calculation mhandler.sendemptymessage (msg_voice_changed);//Send message every 0.1 seconds catch (Interruptedexception e)
{E.printstacktrace ();
}
}
}
};
Private Handler Mhandler = new Handler () {@Override public void Handlemessage (msg) {switch (msg.what) {
Case msg_audio_prepared://Display dialog box Mdialogmanager.showrecordingdialog ();
IsRecording = true;
Open a thread to calculate the recording time new Thread (mgetvoicelevelrunnable). Start ();
Break
Case msg_voice_changed://Update Sound Mdialogmanager.updatevoicelevel (Maudiomanager.getvoicelevel (7));
Break
Case Msg_dialog_dimiss://Cancel dialog box Mdialogmanager.dimissdialog ();
Break
Super.handlemessage (msg);
}
};
Public Audiorecorderbutton (context, AttributeSet attrs) {Super (context, attrs);
Mdialogmanager = new Dialogmanager (context); The recording file holds the address String dir = Environment.getexternalstoragedirectory () + "/ldm_voice";
Maudiomanager = Audiomanager.getinstance (dir); Maudiomanager.setonaudiostatelistener (New Audiomanager.audiostatelistener () {public void wellprepared () {MHandler
. Sendemptymessage (msg_audio_prepared);
}
}); Because this class is a button, you add a listener event Setonlongclicklistener (new Onlongclicklistener () {public boolean onlongclick (View v) in the construction method
{Mready = true;
Maudiomanager.prepareaudio ();
return false;
}
});
The public Audiorecorderbutton {This (context, NULL); /** * @description Callback after completion of recording * @author LDM * @time 2016/6/25 11:18 * @param * * Public interface Audiofinishre
cordercallback {void onfinish (float seconds, String FilePath);
Private Audiofinishrecordercallback Finishrecordercallback;
public void Setfinishrecordercallback (Audiofinishrecordercallback listener) {finishrecordercallback = listener; /** * @param * @description ontouchevent event for button processing * @author LDM * @time 2016/6/25 9:35 * * @Override public boolean ontouchevent (Motionevent event) {//Get touchevent status
int action = Event.getaction ();
Gets the x-axis coordinate int x = (int) event.getx ();
Gets the y-coordinate int y = (int) event.gety ();
Switch (action) {case motionevent.action_down://finger press changestate (state_recording);
Break Case motionevent.action_move://Finger Move if (isrecording) {//To determine whether or not to cancel if (wanttocancle (x, Y) in accordance with x,y coordinates) {CH
Angestate (State_cancel);
else {changestate (state_recording);
}} break;
Case motionevent.action_up://Finger Release if (!mready) {reset ();
Return Super.ontouchevent (event);
} if (!isrecording | | Mtime < 0.6f) {//If time is less than 0.6s, prompt recording of short mdialogmanager.tooshort ();
Maudiomanager.cancel ();
Delay Display dialog box mhandler.sendemptymessagedelayed (Msg_dialog_dimiss, 1000);
else if (mcurrentstate = = state_recording) {//If the status is recording, end the recording Mdialogmanager.dimissdialog (); Maudiomanager.release ();
if (finishrecordercallback!= null) {Finishrecordercallback.onfinish (Mtime, Maudiomanager.getcurrentfilepath ());
} else if (mcurrentstate = state_cancel) {//Want to cancel Mdialogmanager.dimissdialog ();
Maudiomanager.cancel ();
Reset ();
Break
Return Super.ontouchevent (event);
/** * Recovery status and sign bit/private void reset () {isrecording = false;
Mtime = 0;
Mready = false;
Changestate (State_normal);
Private Boolean wanttocancle (int x, int y) {//Exceed button width if (x < 0 | | | x > getwidth ()) {return true;
}//exceeds the height of the button if (Y <-distance_y_cancel | | | y > getheight () + Distance_y_cancel) {return true;
return false; /** * @param * @description Change button Display according to state * @author LDM * @time 2016/6/25 9:36/private void Changestat
E (int state) {if (mcurrentstate!= state) {mcurrentstate = state; Switch (state) {case State_normal:setbackgroundresoUrce (R.drawable.btn_recorder_normal);
SetText (R.string.str_recorder_normal);
Break
Case State_recording:setbackgroundresource (r.drawable.btn_recorder_recording);
SetText (r.string.str_recorder_recording);
if (isrecording) {mdialogmanager.recording ();
} break;
Case State_cancel:setbackgroundresource (r.drawable.btn_recorder_recording);
Mdialogmanager.wanttocancel ();
SetText (R.string.str_recorder_want_cancel);
Break
}
}
}
}
--Dialog management tools class--
/** * @description Dialog Management Tool class * @author LDM * @time 2016/6/25 11:53 * @param/public class Dialogmanager {//Play
Out dialog box private Dialog mdialog;
Recording icon Private ImageView Micon;
Volume display icon private ImageView mvoice;
dialog box prompts the text private TextView mlable;
Contextual object private context Mcontext;
Public Dialogmanager {this.mcontext = context; /** * @param * @description Display dialog box * @author LDM * @time 2016/6/25 9:56/public void Showrecordingdialog ()
{///Sytle instantiated Dialog mdialog = new Dialog (Mcontext, R.style.audiodialog) according to the specified
Layoutinflater inflater = Layoutinflater.from (Mcontext);
View view = Inflater.inflate (R.layout.dialog_recorder, NULL);
Mdialog.setcontentview (view);
Micon = (ImageView) View.findviewbyid (R.id.id_recorder_dialog_icon);
Mvoice = (ImageView) View.findviewbyid (R.id.id_recorder_dialog_voice);
Mlable = (TextView) View.findviewbyid (R.id.id_recorder_dialog_label);
Mdialog.show (); /** * @param * @description isdialog box for recording status * @author LDM * @time 2016/6/25 10:08/public void recording () {if (Mdialog!= null && Mdialo
G.isshowing ()) {micon.setvisibility (view.visible);
Mvoice.setvisibility (view.visible);
Mlable.setvisibility (view.visible);
Micon.setimageresource (R.drawable.recorder);
Mlable.settext ("Slip on the finger, Cancel to send"); }/** * @param * @description Cancel Recording Status dialog box * @author LDM * @time 2016/6/25 10:08/public void Wanttocancel (
{if (Mdialog!= null && mdialog.isshowing ()) {micon.setvisibility (view.visible);
Mvoice.setvisibility (View.gone);
Mlable.setvisibility (view.visible);
Micon.setimageresource (R.drawable.cancel);
Mlable.settext ("Loosen the finger, Cancel to send");
}/** * @param * @description time Too Short dialog box * @author LDM * @time 2016/6/25 10:09/public void Tooshort () {
if (mdialog!= null && mdialog.isshowing ()) {//Display status micon.setvisibility (view.visible);
Mvoice.setvisibility (View.gone); Mlable.setvisibility (View.VISIBLE);
Micon.setimageresource (R.drawable.voice_to_short);
Mlable.settext ("Recording time is too Short");
}/** * @param * @description * @author LDM * @time 2016/6/25 Cancel (Close) dialog */public void Dimissdialog () {
if (mdialog!= null && mdialog.isshowing ()) {//Display status Mdialog.dismiss ();
Mdialog = null; }///Show Update Volume Level dialog box public void Updatevoicelevel (int level) {if (Mdialog!= null && mdialog.isshowing ()) {
Display status micon.setvisibility (view.visible);
Mvoice.setvisibility (view.visible);
Mlable.setvisibility (view.visible); Set the ID of the picture, the sound picture we put in the drawable is in v+ number format int resid = Mcontext.getresources (). Getidentifier ("V" + level, "drawable", Mcont
Ext.getpackagename ());
Mvoice.setimageresource (RESID);
}
}
}
--Sound Playback tool class--
/** * @param * @author LDM * @description Play Sound Tool class * @time 2016/6/25 11:29/public class Mediaplayermanager {//Play
Audio API class: MediaPlayer private static MediaPlayer Mmediaplayer;
Whether the private static Boolean ispause is paused; /** * @param * FilePath: File path * Oncompletionlistener: Playback complete listening * @description play sound * @author LDM * @time 2016/6/25 11:30 */public static void PlaySound (String filePath, Mediaplayer.oncompletionlistener oncompletionlistener) {if (
Mmediaplayer = = null) {Mmediaplayer = new MediaPlayer (); Set an error listener Mmediaplayer.setonerrorlistener (new Mediaplayer.onerrorlistener () {public Boolean onError (Mediapla
Yer arg0, int arg1, int arg2) {mmediaplayer.reset ();
return false;
}
});
else {mmediaplayer.reset ();
try {mmediaplayer.setaudiostreamtype (Android.media.AudioManager.STREAM_MUSIC);
Mmediaplayer.setoncompletionlistener (Oncompletionlistener);
Mmediaplayer.setdatasource (FilePath); Mmediaplayer.prepare();
Mmediaplayer.start (); catch (Exception e) {}}/** * @param * @description paused * @author LDM * @time 2016/6/25 11:31/Pub Lic static void Pause () {if (Mmediaplayer!= null && mmediaplayer.isplaying ()) {//when playing Mmediaplayer.paus
E ();
Ispause = true;
}/** * @param * @description Replay * @author LDM * @time 2016/6/25 11:31/public static void resume () {
if (Mmediaplayer!= null && ispause) {Mmediaplayer.start ();
Ispause = false;
}/** * @param * @description release operation * @author LDM * @time 2016/6/25 11:32/public static void releases () {
if (Mmediaplayer!= null) {mmediaplayer.release ();
Mmediaplayer = null;
}
}
-– Recording Operation Tool class-–
/** * @param * @author LDM * @description Recording Management tool class * @time 2016/6/25 9:39/public class Audiomanager {//audioreco
RD: The main is the implementation of Edge recording Edge broadcast (AUDIORECORD+AUDIOTRACK) and real-time processing of audio.
Advantages: Can real-time speech processing, can realize a variety of audio packaging private Mediarecorder mmediarecorder;
Recording files private String Mdir;
Current recording file directory private String Mcurrentfilepath;
Single case mode private static Audiomanager minstance;
Are you ready for private Boolean isprepare?
Private construction Method Private Audiomanager (String dir) {mdir = dir; //Publish method to get instance public static Audiomanager getinstance (String dir) {if (minstance = null) {synchronized (audiom
Anager.class) {if (minstance = = null) {minstance = new Audiomanager (dir);
}} return minstance; /** * @param * @author LDM * @description Recording Preparation Complete Callback interface * @time 2016/6/25 11:14/public interface Audiosta
Telistener {void wellprepared ();
Public Audiostatelistener Maudiostatelistener; /** * @param * @description Settings callback method for external class calls * @author LDM * @time 2016/6/25 11: */public void Setonaudiostatelistener (Audiostatelistener listener) {Maudiostatelistener = listener;
/** * @param * @description Recording Preparation work * @author LDM * @time 2016/6/25 11:15/public void Prepareaudio () {
try {isprepare = false;
File dir = new file (Mdir);
if (!dir.exists ()) {dir.mkdirs ();//file does not exist, create file} String FileName = Generatefilename ();
File File = new file (dir, fileName);
Mcurrentfilepath = File.getabsolutepath ();
Mmediarecorder = new Mediarecorder ();
Sets the output file path Mmediarecorder.setoutputfile (File.getabsolutepath ());
Set the Mediarecorder audio source as Microphone mmediarecorder.setaudiosource (MediaRecorder.AudioSource.MIC);
Set the audio format to Raw_amr Mmediarecorder.setoutputformat (MediaRecorder.OutputFormat.RAW_AMR);
Set the audio encoding to AMR_NB Mmediarecorder.setaudioencoder (MediaRecorder.AudioEncoder.AMR_NB);
Prepare the recording mmediarecorder.prepare ();
To start, you must call Mmediarecorder.start () after prepare ();
Ready to complete isprepare = true; if (Maudiostatelistener!= null) {maudiostatelistener.wellprepared ();
} catch (Exception e) {e.printstacktrace (); }/** * @param * @description randomly generated recording file name * @author LDM * @time 2016/6/25,/private String Generatefilen
Ame () {///randomly generate different UUID return Uuid.randomuuid (). toString () + ". Amr"; /** * @param * @description Get Volume value * @author LDM * @time 2016/6/25 9:49/public int getvoicelevel (int maxl EVEL) {if (Isprepare) {try {//Getmaxamplitude returns the maximum value is 32767 return maxlevel * Mmediarecorder.getmaxamplitu
De ()/32768 + 1;//Returns the result between 1-7} catch (Exception e) {e.printstacktrace ();
} return 1; /** * @param * @description Releasing resources * @author LDM * @time 2016/6/25 9:50/public void release () {Mmediare
Corder.stop ();
Mmediarecorder.reset ();
Mmediarecorder = null; /** * @param * @description Recording cancellation * @author LDM * @time 2016/6/25 9:51/public void Cancel ()
; if (McurrentfilEpath!= null) {//Cancel the recording after deleting the corresponding file = new file (Mcurrentfilepath);
File.delete ();
Mcurrentfilepath = null; }/** * @param * @description Get current file path * @author LDM * @time 2016/6/25 9:51/public String Getcurrentfi
Lepath () {return mcurrentfilepath;
}
}
There are comments in the code, do not map, and micro-letter voice chat interface, so called imitation micro-letter, hehe. You can also see the effect when you run it. All code can be downloaded from here: Http://xiazai.jb51.net/201611/yuanma/AndroidWXchat (jb51.net). rar
The above is the entire content of this article, I hope to help you learn, but also hope that we support the cloud habitat community.