This commit is contained in:
parent
f0dd009533
commit
013dcaa4ce
|
@ -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<File> mAdapter;
|
||||
private RecordVoicePopWindow mRecordVoicePopWindow;
|
||||
private List<File> 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<File>(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();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/root"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical">
|
||||
|
||||
<com.lqr.recyclerview.LQRRecyclerView
|
||||
android:id="@+id/rvMsg"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="530dp" />
|
||||
|
||||
|
||||
<net.micode.notes.audiodemo.RecordAudioButton
|
||||
android:id="@+id/btnVoice"
|
||||
style="?android:attr/borderlessButtonStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="40dp"
|
||||
android:layout_margin="10dp"
|
||||
android:background="@drawable/community_btn_chat_press_normal"
|
||||
android:text="按住 说话"
|
||||
android:textColor="#7e7e7e" />
|
||||
|
||||
</LinearLayout>
|
Loading…
Reference in New Issue