package com.fanxin.easeui.widget; import android.content.Context; import android.graphics.Color; import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.PowerManager; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import com.fanxin.easeui.model.EaseVoiceRecorder; import com.fanxin.easeui.utils.EaseCommonUtils; import com.fanxin.easeui.widget.chatrow.EaseChatRowVoicePlayClickListener; import com.hyphenate.EMError; import com.hyphenate.easeui.R; /** * Voice recorder view * */ public class EaseVoiceRecorderView extends RelativeLayout { protected Context context; protected LayoutInflater inflater; protected Drawable[] micImages; protected EaseVoiceRecorder voiceRecorder; protected PowerManager.WakeLock wakeLock; protected ImageView micImage; protected TextView recordingHint; protected Handler micImageHandler = new Handler() { @Override public void handleMessage(android.os.Message msg) { // change image micImage.setImageDrawable(micImages[msg.what]); } }; public EaseVoiceRecorderView(Context context) { super(context); init(context); } public EaseVoiceRecorderView(Context context, AttributeSet attrs) { super(context, attrs); init(context); } public EaseVoiceRecorderView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(context); } private void init(Context context) { this.context = context; LayoutInflater.from(context).inflate(R.layout.ease_widget_voice_recorder, this); micImage = (ImageView) findViewById(R.id.mic_image); recordingHint = (TextView) findViewById(R.id.recording_hint); voiceRecorder = new EaseVoiceRecorder(micImageHandler); // animation resources, used for recording micImages = new Drawable[] { getResources().getDrawable(R.drawable.ease_record_animate_01), getResources().getDrawable(R.drawable.ease_record_animate_02), getResources().getDrawable(R.drawable.ease_record_animate_03), getResources().getDrawable(R.drawable.ease_record_animate_04), getResources().getDrawable(R.drawable.ease_record_animate_05), getResources().getDrawable(R.drawable.ease_record_animate_06), getResources().getDrawable(R.drawable.ease_record_animate_07), getResources().getDrawable(R.drawable.ease_record_animate_08), getResources().getDrawable(R.drawable.ease_record_animate_09), getResources().getDrawable(R.drawable.ease_record_animate_10), getResources().getDrawable(R.drawable.ease_record_animate_11), getResources().getDrawable(R.drawable.ease_record_animate_12), getResources().getDrawable(R.drawable.ease_record_animate_13), getResources().getDrawable(R.drawable.ease_record_animate_14), }; wakeLock = ((PowerManager) context.getSystemService(Context.POWER_SERVICE)).newWakeLock( PowerManager.SCREEN_DIM_WAKE_LOCK, "demo"); } /** * on speak button touched * * @param v * @param event */ public boolean onPressToSpeakBtnTouch(View v, MotionEvent event, EaseVoiceRecorderCallback recorderCallback) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: try { if (EaseChatRowVoicePlayClickListener.isPlaying) EaseChatRowVoicePlayClickListener.currentPlayListener.stopPlayVoice(); v.setPressed(true); startRecording(); } catch (Exception e) { v.setPressed(false); } return true; case MotionEvent.ACTION_MOVE: if (event.getY() < 0) { showReleaseToCancelHint(); } else { showMoveUpToCancelHint(); } return true; case MotionEvent.ACTION_UP: v.setPressed(false); if (event.getY() < 0) { // discard the recorded audio. discardRecording(); } else { // stop recording and send voice file try { int length = stopRecoding(); if (length > 0) { if (recorderCallback != null) { recorderCallback.onVoiceRecordComplete(getVoiceFilePath(), length); } } else if (length == EMError.FILE_INVALID) { Toast.makeText(context, R.string.Recording_without_permission, Toast.LENGTH_SHORT).show(); } else { Toast.makeText(context, R.string.The_recording_time_is_too_short, Toast.LENGTH_SHORT).show(); } } catch (Exception e) { e.printStackTrace(); Toast.makeText(context, R.string.send_failure_please, Toast.LENGTH_SHORT).show(); } } return true; default: discardRecording(); return false; } } public interface EaseVoiceRecorderCallback { /** * on voice record complete * * @param voiceFilePath * 录音完毕后的文件路径 * @param voiceTimeLength * 录音时长 */ void onVoiceRecordComplete(String voiceFilePath, int voiceTimeLength); } public void startRecording() { if (!EaseCommonUtils.isSdcardExist()) { Toast.makeText(context, R.string.Send_voice_need_sdcard_support, Toast.LENGTH_SHORT).show(); return; } try { wakeLock.acquire(); this.setVisibility(View.VISIBLE); recordingHint.setText(context.getString(R.string.move_up_to_cancel)); recordingHint.setBackgroundColor(Color.TRANSPARENT); voiceRecorder.startRecording(context); } catch (Exception e) { e.printStackTrace(); if (wakeLock.isHeld()) wakeLock.release(); if (voiceRecorder != null) voiceRecorder.discardRecording(); this.setVisibility(View.INVISIBLE); Toast.makeText(context, R.string.recoding_fail, Toast.LENGTH_SHORT).show(); return; } } public void showReleaseToCancelHint() { recordingHint.setText(context.getString(R.string.release_to_cancel)); recordingHint.setBackgroundResource(R.drawable.ease_recording_text_hint_bg); } public void showMoveUpToCancelHint() { recordingHint.setText(context.getString(R.string.move_up_to_cancel)); recordingHint.setBackgroundColor(Color.TRANSPARENT); } public void discardRecording() { if (wakeLock.isHeld()) wakeLock.release(); try { // stop recording if (voiceRecorder.isRecording()) { voiceRecorder.discardRecording(); this.setVisibility(View.INVISIBLE); } } catch (Exception e) { } } public int stopRecoding() { this.setVisibility(View.INVISIBLE); if (wakeLock.isHeld()) wakeLock.release(); return voiceRecorder.stopRecoding(); } public String getVoiceFilePath() { return voiceRecorder.getVoiceFilePath(); } public String getVoiceFileName() { return voiceRecorder.getVoiceFileName(); } public boolean isRecording() { return voiceRecorder.isRecording(); } }