我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android自定义UI实现微信语音

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android自定义UI实现微信语音

本文实例为大家分享了java获取不同路径的方法,供大家参考,具体内容如下

思路:
自定义Button
获取DialogManager、AudioManager setOnLongClickListener长按事件--做好AudioManager的录音准备工作
AudioManager.setOnAudioStateListener(this)实现录音准备完毕的接口回调方法,方法中去发送MSG_AUDIO_PREPARE消息代表录音准备工作完毕
在mHandler中接收消息,开始开启线程录音,并且计时,计时的过程中,去发送MSG_VOICE_CHANGED消息,去updateVoiceLeve更新音量图标,另外在MotionEvent.ACTION_UP事件中,去定义audioFinishRecorderListener.onFinish接口方法,方法是录音完毕的回调方法,在MainActivity中,mAudioRecorderButton.setAudioFinishRecorderListener实现录音完毕回调方法去更新listViewUi界面

点击listViewItem条目播放动画, MediaManager.playSound并且播放音频

activity_main.xml


<LinearLayout 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:orientation="vertical" 
 tools:context="com.example.imooc_recorder.MainActivity" > 
 <ListView 
 android:id="@+id/id_listview" 
 android:layout_width="fill_parent" 
 android:layout_height="0dp" 
 android:layout_weight="1" 
 android:background="#ebebeb" 
 android:divider="@null" 
 android:dividerHeight="10dp" > 
 </ListView> 
 <FrameLayout 
 android:layout_width="fill_parent" 
 android:layout_height="wrap_content" > 
 <View 
  android:background="#ccc" 
  android:layout_width="fill_parent" 
  android:layout_height="1dp" /> 
 <com.example.recorder_view.AudioRecorderButton 
  android:id="@+id/id_recorder_button" 
  android:layout_width="fill_parent" 
  android:layout_height="wrap_content" 
  android:layout_marginBottom="7dp" 
  android:layout_marginLeft="50dp" 
  android:layout_marginRight="50dp" 
  android:layout_marginTop="6dp" 
  android:background="@drawable/button_recorder_normal" 
  android:gravity="center" 
  android:minHeight="0dp" 
  android:padding="5dp" 
  android:text="@string/str_recorder_nomal" 
  android:textColor="#727272" > 
 </com.example.recorder_view.AudioRecorderButton> 
 </FrameLayout> 
</LinearLayout> 

dialog_recorder.xml---dialog布局文件


<LinearLayout 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:background="@drawable/dialog_loading_bg" 
 android:gravity="center" 
 android:orientation="vertical" 
 android:padding="20dp" > 
 <LinearLayout 
 android:layout_width="wrap_content" 
 android:layout_height="wrap_content" 
 android:orientation="horizontal" > 
 <ImageView 
  android:id="@+id/id_recorder_dialog_icon" 
  android:layout_width="wrap_content" 
  android:layout_height="wrap_content" 
  android:class="lazy" data-src="@drawable/recorder" 
  android:visibility="visible" /> 
 <ImageView 
  android:id="@+id/id_recorder_dialog_voice" 
  android:layout_width="wrap_content" 
  android:layout_height="wrap_content" 
  android:class="lazy" data-src="@drawable/v1" 
  android:visibility="visible" /> 
 </LinearLayout> 
 <TextView 
 android:id="@+id/id_recorder_dialog_label" 
 android:layout_marginTop="5dp" 
 android:text="手指上滑,取消发送" 
 android:textColor="#ffffff" 
 android:layout_width="wrap_content" 
 android:layout_height="wrap_content"/> 
</LinearLayout> 

item_recorder.xml--listview中的每个item


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
 xmlns:tools="http://schemas.android.com/tools" 
 android:layout_width="match_parent" 
 android:background="#eeeeee" 
 android:layout_height="60dp" 
 android:layout_marginTop="5dp" > 
 <ImageView 
 android:id="@+id/id_icon" 
 android:layout_width="40dp" 
 android:layout_height="40dp" 
 android:layout_alignParentRight="true" 
 android:layout_centerVertical="true" 
 android:layout_marginRight="5dp" 
 android:class="lazy" data-src="@drawable/icon" /> 
 <FrameLayout 
 android:id="@+id/id_recorder_length" 
 android:layout_width="wrap_content" 
 android:layout_height="wrap_content" 
 android:layout_centerVertical="true" 
 android:layout_toLeftOf="@id/id_icon" 
 android:background="@drawable/chatto_bg_focused" > 
 <View 
  android:id="@+id/id_recorder_anim" 
  android:layout_width="25dp" 
  android:layout_height="25dp" 
  android:layout_gravity="center_vertical|right" 
  android:background="@drawable/adj" /> 
 </FrameLayout> 
 <TextView 
 android:id="@+id/id_recorder_time" 
 android:layout_centerVertical="true" 
 android:layout_toLeftOf="@id/id_recorder_length" 
 android:layout_marginRight="3dp" 
 android:textColor="#ff777777" 
 android:text="" 
 android:layout_width="wrap_content" 
 android:layout_height="wrap_content" /> 
</RelativeLayout> 

styles.xml


<style name="Theme_AudioDialog" parent="@android:Theme.Dialog"> 
 <item name="android:windowBackground">@android:color/transparent</item> 
 <item name="android:windowFrame">@null</item> 
 <item name="android:windowIsFloating">true</item> 
  <item name="android:windowIsTranslucent">true</item> 
  <item name="android:backgroundDimEnabled">false</item> 
 </style> 

button_recorder_normal.xml


<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
 android:shape="rectangle" > 
 <solid android:color="#ffffff"/> 
 <stroke android:width="1px" android:color="#9b9b9b"/> 
 <corners android:radius="3dp"/> 
</shape> 

button_recorder_recording.xml


<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
 android:shape="rectangle" > 
 <solid android:color="#ffffff"/> 
 <stroke android:width="1px" android:color="#eeeeee"/> 
 <corners android:radius="3dp"/> 
</shape> 

play_anim.xml


<?xml version="1.0" encoding="utf-8"?> 
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" > 
 <item 
 android:drawable="@drawable/v_anim1" 
 android:duration="300"> 
 </item> 
 <item 
 android:drawable="@drawable/v_anim2" 
 android:duration="300"> 
 </item> 
 <item 
 android:drawable="@drawable/v_anim3" 
 android:duration="300"> 
 </item> 
</animation-list> 

MainActivity


package com.example.imooc_recorder; 
import java.util.ArrayList; 
import java.util.List; 
import com.example.recorder_view.AudioRecorderButton; 
import com.example.recorder_view.AudioRecorderButton.AudioFinishRecorderListener; 
import com.example.recorder_view.MediaManager; 
import android.app.Activity; 
import android.graphics.drawable.AnimationDrawable; 
import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
public class MainActivity extends Activity { 
 private ListView mListView; 
 private ArrayAdapter<Recorder> mAdapter; 
 private List<Recorder> mDatas = new ArrayList<MainActivity.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.setAudioFinishRecorderListener(new AudioFinishRecorderListener() { 
  @Override 
  public void onFinish(float seconds, String filePath) { 
  // TODO Auto-generated method stub 
  Recorder recorder = new Recorder(seconds, filePath); 
  mDatas.add(recorder); 
  mAdapter.notifyDataSetChanged(); 
  mListView.setSelection(mDatas.size()-1); 
  } 
 }); 
 mAdapter = new RecorderAdapter(this, mDatas); 
 mListView.setAdapter(mAdapter); 
 mListView.setOnItemClickListener(new OnItemClickListener() { 
  @Override 
  public void onItemClick(AdapterView<?> parent, View view, 
   int position, long id) { 
  if (animView !=null) { 
   animView.setBackgroundResource(R.drawable.adj); 
   animView = null; 
  } 
  //播放动画 
  animView = view.findViewById(R.id.id_recorder_anim); 
  animView.setBackgroundResource(R.drawable.play_anim); 
  AnimationDrawable anim = (AnimationDrawable) animView.getBackground(); 
  anim.start(); 
  //播放音频 
  MediaManager.playSound(mDatas.get(position).filePath,new MediaPlayer.OnCompletionListener() { 
   @Override 
   public void onCompletion(MediaPlayer mp) { 
   // TODO Auto-generated method stub 
   animView.setBackgroundResource(R.drawable.adj); 
   } 
  }); 
  } 
 }); 
 } 
 @Override 
 protected void onPause() { 
 // TODO Auto-generated method stub 
 super.onPause(); 
 MediaManager.pause(); 
 } 
 @Override 
 protected void onResume() { 
 // TODO Auto-generated method stub 
 super.onResume(); 
 MediaManager.resume(); 
 } 
 @Override 
 protected void onDestroy() { 
 // TODO Auto-generated method stub 
 super.onDestroy(); 
 MediaManager.release(); 
 } 
  
 class Recorder{ 
 float time; 
 String filePath; 
 public Recorder(float time, String filePath) { 
  super(); 
  this.time = time; 
  this.filePath = filePath; 
 } 
 public float getTime() { 
  return time; 
 } 
 public void setTime(float time) { 
  this.time = time; 
 } 
 public String getFilePath() { 
  return filePath; 
 } 
 public void setFilePath(String filePath) { 
  this.filePath = filePath; 
 } 
 } 
} 

RecorderAdapter


package com.example.imooc_recorder; 
import java.util.List; 
import com.example.imooc_recorder.MainActivity.Recorder; 
import android.content.Context; 
import android.util.DisplayMetrics; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.view.WindowManager; 
import android.widget.ArrayAdapter; 
import android.widget.BaseAdapter; 
import android.widget.LinearLayout; 
import android.widget.TextView; 
public class RecorderAdapter extends ArrayAdapter<Recorder> { 
// private List<Recorder> mDatas; 
// private Context mContext; 
 private int mMinItemWidth; 
 private int mMaxItemWidth; 
 private LayoutInflater mInflater; 
 public RecorderAdapter(Context context, List<Recorder> datas) { 
 super(context, -1, datas); 
// mContext = context; 
// mDatas = datas; 
 WindowManager wm = (WindowManager) context 
  .getSystemService(Context.WINDOW_SERVICE); 
 DisplayMetrics outMetrics = new DisplayMetrics(); 
 wm.getDefaultDisplay().getMetrics(outMetrics); 
 mMaxItemWidth = (int) (outMetrics.widthPixels * 0.7f); 
 mMinItemWidth = (int) (outMetrics.widthPixels * 0.15f); 
 mInflater = LayoutInflater.from(context); 
 } 
 @Override 
 public View getView(int position, View convertView, ViewGroup parent) { 
 // TODO Auto-generated method stub 
 ViewHolder holder = null; 
 if (convertView == null) { 
  convertView = mInflater.inflate(R.layout.item_recorder, parent, 
   false); 
  holder = new ViewHolder(); 
  holder.seconds = (TextView) convertView.findViewById(R.id.id_recorder_time); 
  holder.length = convertView.findViewById(R.id.id_recorder_length); 
  convertView.setTag(holder); 
 }else { 
  holder = (ViewHolder) convertView.getTag(); 
 } 
 holder.seconds.setText(Math.round(getItem(position).time)+"\""); 
 ViewGroup.LayoutParams lp = holder.length.getLayoutParams(); 
 lp.width = (int) (mMinItemWidth +(mMaxItemWidth/60f*getItem(position).time)); 
 return convertView; 
 } 
 private class ViewHolder { 
 private TextView seconds; 
 private View length; 
 } 
} 

AudioRecorderButton


package com.example.recorder_view; 
import com.example.imooc_recorder.R; 
import com.example.recorder_view.AudioManager.AudioStateListener; 
import android.content.Context; 
import android.os.Environment; 
import android.os.Handler; 
import android.telephony.SignalStrength; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.Button; 
public class AudioRecorderButton extends Button implements AudioStateListener { 
 private static final int DISTANCE_Y_CANCEL = 50; 
  
 private DialogManager mDialogManager; 
  
 private static final int STATE_NORMAL = 1; 
 private static final int STATE_RECORDING = 2; 
 private static final int STATE_WANT_TO_CANCEL = 3; 
  
 private int mCurState = STATE_NORMAL; 
  
 private boolean isRecording = false; 
  
 private AudioManager mAudioManager; 
  
 private float mTime; 
  
 private boolean mReady; 
  
 public AudioRecorderButton(Context context) { 
 super(context); 
 } 
 public AudioRecorderButton(Context context, AttributeSet attrs, int defStyle) { 
 super(context, attrs, defStyle); 
 } 
 public AudioRecorderButton(Context context, AttributeSet attrs) { 
 super(context, attrs); 
 mDialogManager = new DialogManager(getContext()); 
 String dir = Environment.getExternalStorageDirectory() 
  + "/imooc_recorder_audios"; 
 mAudioManager = AudioManager.getInstance(dir); 
 mAudioManager.setOnAudioStateListener(this); 
  
 setOnLongClickListener(new OnLongClickListener() { 
  @Override 
  public boolean onLongClick(View v) { 
  mReady = true; 
  // 录音准备--准备好后,有实现接口方法 
  mAudioManager.prepareAndio(); 
  return false; 
  } 
 }); 
 } 
  
 @Override 
 public void wellPrepared() { 
 // 准备完毕,发送消息 
 mHandler.sendEmptyMessage(MSG_AUDIO_PREPARE); 
 } 
 private Handler mHandler = new Handler() { 
 public void handleMessage(android.os.Message msg) { 
  switch (msg.what) { 
  case MSG_AUDIO_PREPARE: 
  mDialogManager.showRecordingDailog(); 
  isRecording = true; 
  new Thread(new Runnable() { 
   @Override 
   public void run() { 
   // TODO Auto-generated method stub 
   while (isRecording) { 
    try { 
    Thread.sleep(100); 
    // 录音计时 
    mTime += 0.1f; 
    mHandler.sendEmptyMessage(MSG_VOICE_CHANGED); 
    } catch (InterruptedException e) { 
    e.printStackTrace(); 
    } 
   } 
   } 
  }).start(); 
  break; 
  case MSG_VOICE_CHANGED: 
  mDialogManager.updateVoiceLeve(mAudioManager.getVoiceLevel(7)); 
  break; 
  case MSG_DIALOG_DIMISS: 
  mDialogManager.dimissDailog(); 
  break; 
  default: 
  break; 
  } 
  super.handleMessage(msg); 
 }; 
 }; 
 private static final int MSG_AUDIO_PREPARE = 0x110; 
 private static final int MSG_VOICE_CHANGED = 0x111; 
 private static final int MSG_DIALOG_DIMISS = 0x112; 
 @Override 
 public boolean onTouchEvent(MotionEvent event) { 
 // TODO Auto-generated method stub 
 int action = event.getAction(); 
 int x = (int) event.getX(); 
 int y = (int) event.getY(); 
 switch (action) { 
 case MotionEvent.ACTION_DOWN: 
  changeState(STATE_RECORDING); 
  break; 
 case MotionEvent.ACTION_MOVE: 
  if (isRecording) { 
  // 根据xy坐标。判断是否想要取消 
  if (wantToCancel(x, y)) { 
   changeState(STATE_WANT_TO_CANCEL); 
  } else { 
   changeState(STATE_RECORDING); 
  } 
  } 
  break; 
 case MotionEvent.ACTION_UP: 
  if (!mReady) { 
  // 没有触发onclick 
  reset(); 
  return super.onTouchEvent(event); 
  } 
  if (!isRecording || mTime < 0.6f) { 
  // prapred没有完成已经up了 
  mDialogManager.tooShort(); 
  mAudioManager.cancel(); 
  mHandler.sendEmptyMessageDelayed(MSG_DIALOG_DIMISS, 1300); 
  } else if (mCurState == STATE_RECORDING) { 
  mDialogManager.dimissDailog(); 
  mAudioManager.release(); 
  if (audioFinishRecorderListener != null) { 
   audioFinishRecorderListener.onFinish(mTime, 
    mAudioManager.getCurrentFilePath()); 
  } 
  } else if (mCurState == STATE_WANT_TO_CANCEL) { 
  mDialogManager.dimissDailog(); 
  mAudioManager.cancel(); 
  } 
  // 恢复标志位 
  reset(); 
  break; 
 default: 
  break; 
 } 
 return super.onTouchEvent(event); 
 } 
 private void reset() { 
 // TODO Auto-generated method stub 
 mReady = false; 
 mTime = 0; 
 isRecording = false; 
 changeState(STATE_NORMAL); 
 } 
 private boolean wantToCancel(int x, int y) { 
 // x<0代表来到按钮的范围以外 
 if (x < 0 || x > getWidth()) { 
  return true; 
 } 
 if (y < -DISTANCE_Y_CANCEL || y > getHeight() + DISTANCE_Y_CANCEL) { 
  return true; 
 } 
 return false; 
 } 
 private void changeState(int state) { 
 // TODO Auto-generated method stub 
 if (mCurState != state) { 
  mCurState = state; 
  switch (state) { 
  case STATE_NORMAL: 
  setBackgroundResource(R.drawable.button_recorder_normal); 
  setText(R.string.str_recorder_nomal); 
  break; 
  case STATE_RECORDING: 
  setBackgroundResource(R.drawable.button_recorder_recording); 
  setText(R.string.str_recorder_recording); 
  if (isRecording) { 
   // to do 
   mDialogManager.recording(); 
  } 
  break; 
  case STATE_WANT_TO_CANCEL: 
  setBackgroundResource(R.drawable.button_recorder_recording); 
  setText(R.string.str_recorder_want_cancel); 
  mDialogManager.wantToCancle(); 
  break; 
  default: 
  break; 
  } 
 } 
 } 
  
 public interface AudioFinishRecorderListener { 
 void onFinish(float seconds, String filePath); 
 } 
 private AudioFinishRecorderListener audioFinishRecorderListener; 
 public void setAudioFinishRecorderListener( 
  AudioFinishRecorderListener audioFinishRecorderListener) { 
 this.audioFinishRecorderListener = audioFinishRecorderListener; 
 } 
} 

DialogManager


package com.example.recorder_view; 
import com.example.imooc_recorder.R; 
import android.app.Dialog; 
import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.widget.ImageView; 
import android.widget.TextView; 
public class DialogManager { 
 private Dialog mDialog; 
 private ImageView mIcon; 
 private ImageView mVoice; 
 private TextView mLabel; 
 private Context mContext; 
 public DialogManager(Context context) { 
 this.mContext = context; 
 } 
 public void showRecordingDailog() { 
 mDialog = new Dialog(mContext, R.style.Theme_AudioDialog); 
 LayoutInflater inflater = LayoutInflater.from(mContext); 
 View view = inflater.inflate(R.layout.dialog_recorder, null); 
 mDialog.setContentView(view); 
 mIcon = (ImageView) mDialog.findViewById(R.id.id_recorder_dialog_icon); 
 mVoice = (ImageView) mDialog 
  .findViewById(R.id.id_recorder_dialog_voice); 
 mLabel = (TextView) mDialog.findViewById(R.id.id_recorder_dialog_label); 
 mDialog.show(); 
 } 
 public void recording() { 
 if (mDialog != null && mDialog.isShowing()) { 
  mIcon.setVisibility(View.VISIBLE); 
  mVoice.setVisibility(View.VISIBLE); 
  mLabel.setVisibility(View.VISIBLE); 
  mIcon.setImageResource(R.drawable.recorder); 
  mLabel.setText("手指上滑,取消发送"); 
 } 
 } 
 public void wantToCancle() { 
 if (mDialog != null && mDialog.isShowing()) { 
  mIcon.setVisibility(View.VISIBLE); 
  mVoice.setVisibility(View.GONE); 
  mLabel.setVisibility(View.VISIBLE); 
  mIcon.setImageResource(R.drawable.cancel); 
  mLabel.setText("松开手指,取消发送"); 
 } 
 } 
 public void tooShort() { 
 if (mDialog != null && mDialog.isShowing()) { 
  mIcon.setVisibility(View.VISIBLE); 
  mVoice.setVisibility(View.GONE); 
  mLabel.setVisibility(View.VISIBLE); 
  mIcon.setImageResource(R.drawable.voice_to_short); 
  mLabel.setText("录音时间过短"); 
 } 
 } 
 public void dimissDailog() { 
 if (mDialog != null && mDialog.isShowing()) { 
  mDialog.dismiss(); 
  mDialog = null; 
 } 
 } 
 public void updateVoiceLeve(int level) { 
 if (mDialog != null && mDialog.isShowing()) { 
//  mIcon.setVisibility(View.VISIBLE); 
//  mVoice.setVisibility(View.VISIBLE); 
//  mLabel.setVisibility(View.VISIBLE); 
  // 通过方法名字,找到资源 
  int resId = mContext.getResources().getIdentifier("v" + level, 
   "drawable", mContext.getPackageName()); 
  mVoice.setImageResource(resId); 
 } 
 } 
} 

AudioManager


package com.example.recorder_view; 
import java.io.File; 
import java.io.IOException; 
import java.util.UUID; 
import javax.security.auth.PrivateCredentialPermission; 
import android.R.integer; 
import android.media.MediaRecorder; 
public class AudioManager { 
 private MediaRecorder mMediaRecorder; 
 private String mDir; 
 private String mCurrentFilepath; 
 private static AudioManager mInstance; 
 private boolean isPrepare; 
  
 public interface AudioStateListener { 
 void wellPrepared(); 
 } 
 public AudioStateListener mAudioStateListener; 
 public void setOnAudioStateListener(AudioStateListener audioStateListener) { 
 mAudioStateListener = audioStateListener; 
 } 
 private AudioManager(String dir) { 
 this.mDir = dir; 
 } 
 public static AudioManager getInstance(String dir) { 
 if (mInstance == null) { 
  synchronized (AudioManager.class) { 
  if (mInstance == null) { 
   mInstance = new AudioManager(dir); 
  } 
  } 
 } 
 return mInstance; 
 } 
 public void prepareAndio() { 
 isPrepare = false; 
 File dir = new File(mDir); 
 if (!dir.exists()) { 
  dir.mkdirs(); 
 } 
 String fileName = geneFileName(); 
 File file = new File(dir, fileName); 
 mCurrentFilepath = file.getAbsolutePath(); 
 mMediaRecorder = new MediaRecorder(); 
 // 设置输出文件 
 mMediaRecorder.setOutputFile(file.getAbsolutePath()); 
 // 音频源头 
 mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
 // 设置音频格式 
 mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR); 
 // 设置音频编码 
 mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
 try { 
  mMediaRecorder.prepare(); 
  mMediaRecorder.start(); 
  isPrepare = true; 
  if (mAudioStateListener != null) { 
  mAudioStateListener.wellPrepared(); 
  } 
 } catch (Exception e) { 
  // TODO Auto-generated catch block 
  e.printStackTrace(); 
 } 
 } 
 private String geneFileName() { 
 return UUID.randomUUID().toString() + ".amr"; 
 } 
 public int getVoiceLevel(int maxLevel) { 
 if (isPrepare) { 
  try { 
  // mMediaRecorder.getMaxAmplitude() 1~32767 
  // return maxlevel*mMediaRecorder.getMaxAmplitude()/32768+1; 
  return maxLevel * new MediaRecorder().getMaxAmplitude() / 32768 
   + 1; 
  } catch (Exception e) { 
  } 
 } 
 return 1; 
 } 
 public void release() { 
 mMediaRecorder.release(); 
 mMediaRecorder = null; 
 } 
 public void cancel() { 
 release(); 
 if (mCurrentFilepath != null) { 
  File file = new File(mCurrentFilepath); 
  file.delete(); 
  mCurrentFilepath = null; 
 } 
 } 
 public String getCurrentFilePath() { 
 // TODO Auto-generated method stub 
 return mCurrentFilepath; 
 } 
} 

MediaManager


package com.example.recorder_view; 
import java.io.IOException; 
import android.media.AudioManager; 
import android.media.MediaPlayer; 
import android.media.MediaPlayer.OnCompletionListener; 
import android.media.MediaPlayer.OnErrorListener; 
public class MediaManager { 
 private static MediaPlayer mediaPlayer; 
 private static boolean isPause; 
 public static void playSound(String filePath, 
  OnCompletionListener onCompletionListener) { 
 if (mediaPlayer == null) { 
  mediaPlayer = new MediaPlayer(); 
  mediaPlayer.setOnErrorListener(new OnErrorListener() { 
  @Override 
  public boolean onError(MediaPlayer mp, int what, int extra) { 
   mediaPlayer.reset(); 
   return false; 
  } 
  }); 
 }else { 
  mediaPlayer.reset(); 
 } 
 try { 
  mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
  mediaPlayer.setOnCompletionListener(onCompletionListener); 
  mediaPlayer.setDataSource(filePath); 
  mediaPlayer.prepare(); 
 } catch (Exception e) { 
  e.printStackTrace(); 
 } 
 mediaPlayer.start(); 
 } 
 public static void pause(){ 
 if (mediaPlayer!=null && mediaPlayer.isPlaying()) { 
  mediaPlayer.pause(); 
  isPause = true; 
 } 
 } 
 public static void resume(){ 
 if (mediaPlayer!=null && isPause) { 
  mediaPlayer.start(); 
  isPause = false; 
 } 
 } 
 public static void release(){ 
 if (mediaPlayer!=null) { 
  mediaPlayer.release(); 
  mediaPlayer = null; 
 } 
 } 
} 

本文已被整理到了《Android微信开发教程汇总》,欢迎大家学习阅读。

您可能感兴趣的文章:Android仿微信语音对讲录音功能Android仿微信录制语音功能Android实现录音方法(仿微信语音、麦克风录音、发送语音、解决5.0以上BUG)Android仿微信语音消息的录制和播放功能Android仿微信发送语音消息的功能及示例代码Android仿微信语音聊天界面设计android仿微信聊天界面 语音录制功能Android 高仿微信语音聊天页面高斯模糊(毛玻璃效果)Android仿微信语音聊天功能Android自定义View实现微信语音界面


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android自定义UI实现微信语音

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android自定义UI实现微信语音

本文实例为大家分享了java获取不同路径的方法,供大家参考,具体内容如下 思路: 自定义Button 获取DialogManager、AudioManager setOnLongClickListener长按事件--做好AudioManag
2022-06-06

Android自定义仿微信PopupWindow效果

给大家分享一个高仿微信的PopupWindow、就是微信的扫一扫那个功能窗口、下面有应用运行效果图、更加直观的展示了Demo的效果、源代码是通过两种方法实现的、大家可以下载源代码研究研究、集成到自己的项目中也是很方便的、希望对大家有用、先看
2022-06-06

Android自定义View仿微信LetterView效果

废话不多说了,具体代码如下所示:public class LetterView extends View {private String TAG = LetterView.class.getSimpleName();//A,B,C....Z
2022-06-06

Android自定义控件实现UC浏览器语音搜索效果

最近项目上要实现语音搜索功能,界面样式要模仿一下UC浏览器的样式,UC浏览器中有一个控件,会随着声音大小浮动,然后寻思偷个懒,百度一下,结果也没有找到类似的,只能自己动手了。先上图看我实现的效果:这是自定义控件的代码,里面注释也很明白,就
2023-05-31

Android UI控件RatingBar实现自定义星星评分效果

本文实例为大家分享了Android RatingBar星星评分效果的具体代码,供大家参考,具体内容如下 继承关系 AppCompatRatingBar效果图xml
2022-06-06

微信小程序自定义tabBar(实操)

文章目录 一、前言二、固定效果图实现步骤实现步骤完整代码-矢量图images图片app.json代码 三、自定义效果图实现步骤实现步骤完整代码-矢量图images图片app.json代码custom-tab-bar下的
2023-08-20

Android实现自定义日历

自定义日历控件,支持旧历、节气、日期标注、点击操作 (参考网络上的日历控件改写) 注:将下面的四张资源图片拷贝到所建包的下一个image目录中,如Calendar.java 所在包为 cc.util.android.view,则需要再创建一
2022-06-06

Android自定义View实现通讯录字母索引(仿微信通讯录)

一、效果:我们看到很多软件的通讯录在右侧都有一个字母索引功能,像微信,小米通讯录,QQ,还有美团选择地区等等。这里我截了一张美团选择城市的图片来看看;我们今天就来实现图片中右侧模块的索引功能,包括触摸显示以选中的索引字母。这里我的UI界面主
2022-06-06

微信小程序怎么实现自定义导航栏

今天小编给大家分享一下微信小程序怎么实现自定义导航栏的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、要实现自定义导航栏,首
2023-06-29

Android用PopupWindow实现自定义overflow

本文实例为大家分享了PopupWindow实现自定义overflow的具体代码,供大家参考,具体内容如下 当Action Bar的Action放不下时,系统会将其收集在overflow中。 用hierarchyviewer查看系统自己生成的
2022-06-06

Android自定义Style实现方法

styles.xml如下: [html] 代码如下: