diff --git a/src/app/src/main/java/net/micode/notes/audiodemo/VoiceActivity.java b/src/app/src/main/java/net/micode/notes/audiodemo/VoiceActivity.java new file mode 100644 index 0000000..8c25711 --- /dev/null +++ b/src/app/src/main/java/net/micode/notes/audiodemo/VoiceActivity.java @@ -0,0 +1,255 @@ +package net.micode.notes.audiodemo; + +import android.Manifest; +import android.content.Context; +import android.net.Uri; +import android.os.Bundle; +import android.os.Environment; +import android.support.annotation.Nullable; +import android.support.v7.app.AppCompatActivity; +import android.util.Log; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.Toast; + +import com.lqr.adapter.LQRAdapterForRecyclerView; +import com.lqr.adapter.LQRViewHolder; +import com.lqr.adapter.LQRViewHolderForRecyclerView; +import com.lqr.adapter.OnItemClickListener; +import com.lqr.audio.AudioPlayManager; +import com.lqr.audio.AudioRecordManager; +import com.lqr.audio.IAudioPlayListener; +import com.lqr.audio.IAudioRecordListener; +import com.lqr.recyclerview.LQRRecyclerView; + +import net.micode.notes.R; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.Optional; +import kr.co.namee.permissiongen.PermissionGen; +/* +录音主程序 + */ +public class MainActivity extends AppCompatActivity { + + private static final int MAX_VOICE_TIME = 20; + private static final String AUDIO_DIR_NAME = "community_audio"; + //录音背景 + + @BindView(R.id.root) + LinearLayout mRoot; + //放置录音项的背景 + + @BindView(R.id.rvMsg) + LQRRecyclerView mRvMsg; + //录音按钮 + + @BindView(R.id.btnVoice) + RecordAudioButton mBtnVoice; + + private Context mContext; + private File mAudioDir; + private LQRAdapterForRecyclerView mAdapter; + private RecordVoicePopWindow mRecordVoicePopWindow; + private List mData = new ArrayList<>(); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mContext = this; + setContentView(R.layout.activity_main); + ButterKnife.bind(this); + request(); + initVoice(); + initData(); + } + //开放权限 + private void request() { + PermissionGen.with(this) + .addRequestCode(100) + .permissions(Manifest.permission.RECORD_AUDIO + , Manifest.permission.WRITE_EXTERNAL_STORAGE + , Manifest.permission.WAKE_LOCK + , Manifest.permission.READ_EXTERNAL_STORAGE) + .request(); + } + //初始化声音 + private void initVoice() { + mAudioDir = new File(Environment.getExternalStorageDirectory(), AUDIO_DIR_NAME); + if (!mAudioDir.exists()) { + mAudioDir.mkdirs(); + } + //利用AudioRecordManager类获取设置录音位置 + AudioRecordManager.getInstance(mContext).setAudioSavePath(mAudioDir.getAbsolutePath()); + + //利用AudioRecordManager类设置最大录音时间 + AudioRecordManager.getInstance(this).setMaxVoiceDuration(MAX_VOICE_TIME); + //实现按钮录音 + mBtnVoice.setOnVoiceButtonCallBack(new RecordAudioButton.OnVoiceButtonCallBack() { + + @Override + //开始录音 + public void onStartRecord() { + AudioRecordManager.getInstance(mContext).startRecord(); + } + + @Override + //停止录音 + public void onStopRecord() { + AudioRecordManager.getInstance(mContext).stopRecord(); + } + + @Override + //将要取消录音 + public void onWillCancelRecord() { + AudioRecordManager.getInstance(mContext).willCancelRecord(); + } + //继续录音 + @Override + public void onContinueRecord() { + AudioRecordManager.getInstance(mContext).continueRecord(); + } + }); + AudioRecordManager.getInstance(this).setAudioRecordListener(new IAudioRecordListener() { + @Override + //初始化提示视图 + public void initTipView() { + if (mRecordVoicePopWindow == null) { + mRecordVoicePopWindow = new RecordVoicePopWindow(mContext); + } + mRecordVoicePopWindow.showAsDropDown(mRoot); + } + //设置超时提示视图 + @Override + public void setTimeoutTipView(int counter) { + if (mRecordVoicePopWindow != null) { + mRecordVoicePopWindow.showTimeOutTipView(counter); + } + } + //设置记录视图 + @Override + public void setRecordingTipView() { + if (mRecordVoicePopWindow != null) { + mRecordVoicePopWindow.showRecordingTipView(); + } + } + //设置录音过短视图 + @Override + public void setAudioShortTipView() { + if (mRecordVoicePopWindow != null) { + mRecordVoicePopWindow.showRecordTooShortTipView(); + } + } + //设置取消录音视图 + @Override + public void setCancelTipView() { + if (mRecordVoicePopWindow != null) { + mRecordVoicePopWindow.showCancelTipView(); + } + } + //取消提示视图 + @Override + public void destroyTipView() { + if (mRecordVoicePopWindow != null) { + mRecordVoicePopWindow.dismiss(); + } + } + + @Override + public void onStartRecord() { + + } + + @Override + public void onFinish(Uri audioPath, int duration) { + File file = new File(audioPath.getPath()); + if (file.exists()) { + Toast.makeText(getApplicationContext(), "录制成功", Toast.LENGTH_SHORT).show(); + loadData(); + } + } + + @Override + public void onAudioDBChanged(int db) { + if (mRecordVoicePopWindow != null) { + mRecordVoicePopWindow.updateCurrentVolume(db); + } + } + }); + } + + private void initData() { + loadData(); + setAdapter(); + } + + + private void loadData() { + if (mAudioDir.exists()) { + mData.clear(); + File[] files = mAudioDir.listFiles(); + for (File file : files) { + if (file.getAbsolutePath().endsWith("voice")) { + mData.add(file); + } + } + setAdapter(); + } + } + //设置适配器 + private void setAdapter() { + if (mAdapter == null) { + mAdapter = new LQRAdapterForRecyclerView(this, mData, R.layout.community_adapter_chat_list_right_voice) { + @Override + public void convert(LQRViewHolderForRecyclerView helper, File item, int position) { + //这里就不考虑语音长度了,实际开发中用到的Sdk有提供保存语音信息的bean + + } + }; + mAdapter.setOnItemClickListener(new OnItemClickListener() { + @Override + public void onItemClick(LQRViewHolder helper, ViewGroup parent, View itemView, int position) { + //AudioPlayManager类停止播放 + AudioPlayManager.getInstance().stopPlay(); + File item = mData.get(position); + final VoiceImageView ivAudio = helper.getView(R.id.iv_voice); + Uri audioUri = Uri.fromFile(item); + Log.e("LQR", audioUri.toString()); + //AudioPlayManager类开始播放 + AudioPlayManager.getInstance().startPlay(mContext, audioUri, new IAudioPlayListener() { + @Override + public void onStart(Uri var1) { + ivAudio.startPlay(); + } + + @Override + public void onStop(Uri var1) { + ivAudio.stopPlay(); + } + + @Override + public void onComplete(Uri var1) { + ivAudio.stopPlay(); + } + }); + } + }); + /*设置一个新的适配器以根据需要提供子视图。 + 当适配器被更改时,所有现有的视图都会被回收回池中。 + 如果池中有只有一个适配器,它将被清除。 + */ + mRvMsg.setAdapter(mAdapter); + } else + + { + //刷新数据 + mAdapter.notifyDataSetChangedWrapper(); + } + } +} diff --git a/src/app/src/main/res/layout/activity_voice.xml b/src/app/src/main/res/layout/activity_voice.xml new file mode 100644 index 0000000..5e637a4 --- /dev/null +++ b/src/app/src/main/res/layout/activity_voice.xml @@ -0,0 +1,24 @@ + + + + + + + + +