RecorderManager
Android仿微信录制音视频的管理工具,支持自定义,设置录制时长、保存路径、摄像头切换等。Android management tool for imitating wechat to record audio and video, supporting customization, setting recording duration, saving path, camera switching, etc
Install / Use
/learn @MingYueChunQiu/RecorderManagerREADME
RecorderManager
因为在项目中经常需要使用音视频录制,所以写了一个公共库RecorderManager,欢迎大家使用。
最新0.4.0-beta.5版本:</br> 1.升级依赖</br> 2.移除EasyPermissions和废弃方法,使用新API registerForActivityResult,请采用Java1.8以上版本</br> 3.重构框架,优化代码 4.库调用做部分调整,详见下方文档说明 5.欢迎大家测试反馈完善功能
0.3.2版本:1.移除strings.xml中app_name</br> 2.升级kotlin</br>
0.3.1版本更新:详情见文档</br> 1.新增最小录制时间设置RecordVideoOption.setMinDuration(//最小录制时长(秒数,最小是1,会自动调整不大于最大录制时长))</br> 2.优化代码</br>
0.3-beta.2版本更新: 1.重构项目代码,kotlin改写部分功能</br> 2.移除rxjava库,减少依赖</br> 3.升级最新SDK</br> 4.新增闪光灯功能,增加计时前提示文本设置</br> 5.增加国际化支持,英文和中文 6.修复已知问题,优化代码</br> 7.对外用户调用API改动较少,主要为内部调整,见下方文档,欢迎大家测试反馈完善功能</br>
0.2.29版本更新: 1.新增圆形进度按钮配置功能</br> 2.新增指定前后置摄像头功能</br> 3.优化代码,调整启动视频录制配置项</br>
0.2.28版本更新:</br> 1.优化视频录制结果获取方式</br> 2.优化代码</br>
0.2.27版本更新:</br> 1.视频录制界面RecordVideoRequestOption新增RecorderOption和hideFlipCameraButton配置</br> 2.优化代码</br>
0.2.26版本更新:</br> 1.项目迁移至AndroidX, 引入Kotlin</br>
0.2.25版本更新:</br> 1.优化权限自动申请,可自动调起视频录制界面</br> 2.规范图片资源命名</br>
一.效果展示
仿微信界面视频录制
2.音频录制界面比较简单,就不放图了
二.引用
1.Add it in your root build.gradle at the end of repositories
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
2.Add the dependency
dependencies {
implementation 'com.github.MingYueChunQiu:RecorderManager:0.3.2'
}
三.使用
1.音频录制
采用默认配置录制
mRecorderManager.recordAudio(mFilePath);
自定义配置参数录制
mRecorderManager.recordAudio(new RecorderOption.Builder()
.setAudioSource(MediaRecorder.AudioSource.MIC)
.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)
.setAudioEncoder(MediaRecorder.AudioEncoder.AAC)
.setAudioSamplingRate(44100)
.setBitRate(96000)
.setFilePath(path)
.build());
2.视频录制
(1).可以直接使用RecordVideoActivity,实现了仿微信风格的录制界面
从0.2.18开始改为类似
RecorderManagerFactory.getRecordVideoRequest().startRecordVideo(MainActivity.this, 0);
从0.4.0-beta版本开始,因为采用registerForActivityResult,所以直接传入结果回调
RecorderManagerProvider.getRecordVideoRequester().startRecordVideo(MainActivity.this, new RMRecordVideoResultCallback() {
@Override
public void onResponseRecordVideoResult(@NonNull RecordVideoResultInfo info) {
Log.e("MainActivity", "onActivityResult: " + info.getDuration() + " " + info.getFilePath());
Toast.makeText(MainActivity.this, info.getDuration() + " " + info.getFilePath(), Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(@NonNull RecorderManagerException e) {
Log.e("MainActivity", "onActivityResult: " + e.getErrorCode() + " " + e.getMessage());
}
});
从0.4.0-beta版本开始:RecorderManagerFactory重命名为RecorderManagerProvider RecorderManagerFactory中可以拿到IRecordVideoPageRequester,在IRecordVideoPageRequester接口中
/**
* 以默认配置打开录制视频界面
*
* @param activity Activity
* @param requestCode 请求码
*/
void startRecordVideo(@NonNull FragmentActivity activity, int requestCode);
/**
* 以默认配置打开录制视频界面
*
* @param fragment Fragment
* @param requestCode 请求码
*/
void startRecordVideo(@NonNull Fragment fragment, int requestCode);
/**
* 打开录制视频界面
*
* @param activity Activity
* @param requestCode 请求码
* @param option 视频录制请求配置信息类
*/
void startRecordVideo(@NonNull FragmentActivity activity, int requestCode, @Nullable RecordVideoRequestOption option);
/**
* 打开录制视频界面
*
* @param fragment Fragment
* @param requestCode 请求码
* @param option 视频录制请求配置信息类
*/
void startRecordVideo(@NonNull Fragment fragment, int requestCode, @Nullable RecordVideoRequestOption option);
从0.4.0-beta版本开始:
public interface IRecordVideoPageRequester extends IRMRequester {
/**
* 以默认配置打开录制视频界面
*
* @param activity Activity
* @param callback 视频录制结果回调
*/
void startRecordVideo(@NonNull FragmentActivity activity, @NonNull RMRecordVideoResultCallback callback);
/**
* 以默认配置打开录制视频界面
*
* @param fragment Fragment
* @param callback 视频录制结果回调
*/
void startRecordVideo(@NonNull Fragment fragment, @NonNull RMRecordVideoResultCallback callback);
/**
* 打开录制视频界面
*
* @param activity Activity
* @param option 视频录制请求配置信息类
* @param callback 视频录制结果回调
*/
void startRecordVideo(@NonNull FragmentActivity activity, @Nullable RecordVideoRequestOption option, @NonNull RMRecordVideoResultCallback callback);
/**
* 打开录制视频界面
*
* @param fragment Fragment
* @param option 视频录制请求配置信息类
* @param callback 视频录制结果回调
*/
void startRecordVideo(@NonNull Fragment fragment, @Nullable RecordVideoRequestOption option, @NonNull RMRecordVideoResultCallback callback);
}
RecordVideoRequestOption可配置最大时长(秒)和文件保存路径
public class RecordVideoRequestOption implements Parcelable {
private String filePath;//文件保存路径
private int maxDuration;//最大录制时间(秒数)
private RecordVideoOption recordVideoOption;//录制视频配置信息类(里面配置的filePath和maxDuration会覆盖外面的)
}
RecordVideoActivity里已经配置好了默认参数,可以直接使用,然后在onActivityResult里拿到视频路径的返回值 返回值为RecordVideoResultInfo
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK && requestCode == 0) {
RecordVideoResultInfo info = data.getParcelableExtra(EXTRA_RECORD_VIDEO_RESULT_INFO);
//从0.2.28版本开始可以使用下面这种方式,更安全更灵活,兼容性强
RecordVideoResultInfo info = RecorderManagerFactory.getRecordVideoResult(data);
//从0.3版本开始
RecordVideoResultInfo info = RecorderManagerFactory.getRecordVideoResultParser().parseRecordVideoResult(data);
if (info != null) {
Log.e("MainActivity", "onActivityResult: " + " "
+ info.getDuration() + " " + info.getFilePath());
}
}
}
从0.4.0-beta.1版本开始: 由于采用Android新API registerForActivityResult,所以startActivityForResult等相关方法皆已废弃,相关回调将直接通过RMRecordVideoResultCallback传递
interface RMRecordVideoResultCallback {
fun onResponseRecordVideoResult(info: RecordVideoResultInfo)
fun onFailure(e: RecorderManagerException)
}
通过下列IRecordVideoPageRequester相关方法,调用时同时传入响应结果回调
void startRecordVideo(@NonNull FragmentActivity activity, @NonNull RMRecordVideoResultCallback callback);
(2).如果想要界面一些控件的样式,可以继承RecordVideoActivity,里面提供了几个protected方法,可以拿到界面的一些控件
/**
* 获取计时控件
*
* @return 返回计时AppCompatTextView
*/
protected AppCompatTextView getTimingView() {
return mRecordVideoFg == null ? null : mRecordVideoFg.getTimingView();
}
/**
* 获取圆形进度按钮
*
* @return 返回进度CircleProgressButton
*/
protected CircleProgressButton getCircleProgressButton() {
return mRecordVideoFg == null ? null : mRecordVideoFg.getCircleProgressButton();
}
/**
* 获取翻转摄像头控件
*
* @return 返回翻转摄像头AppCompatImageView
*/
public AppCompatImageView getFlipCameraView() {
return mRecordVideoFg == null ? null : mRecordVideoFg.getFlipCameraView();
}
/**
* 获取播放控件
*
* @return 返回播放AppCompatImageView
*/
protected AppCompatImageView getPlayView() {
return mRecordVideoFg == null ? null : mRecordVideoFg.getPlayView();
}
/**
* 获取取消控件
*
* @return 返回取消AppCompatImageView
*/
protected AppCompatImageView getCancelView() {
return mRecordVideoFg == null ? null : mRecordVideoFg.getCancelView();
}
/**
* 获取确认控件
*
* @return 返回确认AppCompatImageView
*/
protected AppCompatImageView getConfirmView() {
return mRecordVideoFg == null ? null : mRecordVideoFg.getConfirmView();
}
/**
* 获取返回控件
*
* @return 返回返回AppCompatImageView
*/
protected AppCompatImageView getBackView() {
return mRecordVideoFg == null ? null : mRecordVideoFg.getBackView();
}
想要替换图标资源的话,提供下列名称图片
rm_record_video_flip_camera.png
rm_record_video_cancel.png
rm_record_video_confirm.png
rm_record_video_play.png
rm_record_video_pull_down.png
rm_record_video_flashlight_turn_off.png
rm_record_video_flashlight_turn_on.png
(3).同时提供了对应的RecordVideoFragment,实现与RecordVideoActivity同样的功能,实际RecordVideoActivity就是包裹了一个RecordVideoFragment
1.创建RecordVideoFragment
/**
* 获取录制视频Fragment实例(使用默认配置项)
*
* @param filePath 存储文件路径
* @return 返回RecordVideoFragment
*/
public static RecordVideoFragment newInstance(@Nullable String filePath) {
return newInstance(filePath, 30);
}
/**
* 获取录制视频Fragment实例(使用默认配置项)
*
* @param filePath 存储文件路径
* @param maxDuration 最大时长(秒数)
* @return 返回RecordVideoFragment
*/
public static RecordVideoFragment newInstance(@Nullable String filePath, int maxDuration) {
return newInstance(new RecordVideoOption.Builder()
.setRecorderOption(new RecorderOption.Builder().buildDefaultVideoBean(filePath))
.setMaxDuration(maxDuration)
.build());
}
/**
* 获取录制视频Fragment实例
*
* @param option 录制配置信息对象
* @return 返回RecordVideoFragment
*/
public static RecordVideoFragment newInstance(@Nullable RecordVideoOption option) {
RecordVideoFragment fragment = new RecordVideoFragment();
Bundle args = new Bundle();
args.putParcelable(BUNDLE_EXTRA_RECORD_VIDEO_OPTION, option == null ? new RecordVideoOption() : option);
fragment.se
