Android 仿QQ/微信语音功能。
2017-02-28 15:11
204 查看
简单仿照一个语音效果,效果图:
所以,首先先做一个Dialog用于展示我们说话的UI:
VoiceDialogManager.java
用到的布局文件:
dialog_voice_manager.xml
布局文件用到的圆角背景:
shape.xml
frame动画xml
语音动画图片资源:
自此,一个语音动画的Dialog就已经完成了,那么我们下面继续真正录音的逻辑吧。
停止录音时释放资源:
有时候在录音不足1秒或者我们需要取消,我们需要删除取消的文件,所以再定义一个取消函数:
上述代码会把录音文件输出到我们指定的文件路径下,我们只需记录这个路径,然后播放就行了,对了,最后记得加上录音所需权限:
所以,首先先做一个Dialog用于展示我们说话的UI:
VoiceDialogManager.java
/** * 语音Dialog 管理器 * Created by Administrator on 2017/2/28 0028. */ public class VoiceDialogManager { private Dialog dialog; private Context context; private ImageView dialog_iv_icon; private AnimationDrawable anim; public VoiceDialogManager(Context context) { this.context = context; init(); } /** * Dialog初始化方法 */ private void init() { dialog = new Dialog(context, R.style.DialogThemes); View inflate = LayoutInflater.from(context).inflate(R.layout.dialog_voice_manager, null); dialog.show(); dialog.setContentView(inflate); dialog_iv_icon = (ImageView) dialog.findViewById(R.id.dialog_iv_icon); dialog_iv_icon.setBackgroundResource(R.drawable.frame); anim = (AnimationDrawable) dialog_iv_icon.getBackground(); anim.start(); Window dialogWindow = dialog.getWindow(); WindowManager.LayoutParams lp = dialogWindow.getAttributes(); dialogWindow.setGravity(Gravity.BOTTOM /**| Gravity.TOP*/); //lp.x = 100; // 新位置X坐标 lp.y = 100; // 新位置Y坐标 lp.width = dp2px(260); // 宽度 lp.height = dp2px(260); // 高度 lp.alpha = 0.7f; // 透明度 dialogWindow.setAttributes(lp); } private int dp2px(int dpValue) { return (int) context.getResources().getDisplayMetrics().density * dpValue; } public void show() { if (dialog != null) { dialog.show(); } } public void dismiss() { if (dialog != null) { anim.stop(); dialog.dismiss(); anim = null; dialog = null; } } }
用到的布局文件:
dialog_voice_manager.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/shape" android:gravity="center" android:orientation="vertical"> <ImageView android:id="@+id/dialog_iv_icon" android:layout_width="90dp" android:layout_height="90dp" android:layout_gravity="center" /> </LinearLayout>
布局文件用到的圆角背景:
shape.xml
<?xml version="1.0" encoding="UTF-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <!-- 填充的颜色 --> <solid android:color="#ccc" /> <!-- 设置按钮的四个角为弧形 --> <!-- android:radius 弧形的半径 --> <corners android:radius="15dip" /> <!-- padding:View边界的间隔 --> <padding android:bottom="10dp" android:left="10dp" android:right="10dp" android:top="10dp" /> </shape>
frame动画xml
<?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="@drawable/voice1" android:duration="300" /> <item android:drawable="@drawable/voice2" android:duration="300" /> <item android:drawable="@drawable/voice3" android:duration="300" /> </animation-list>
语音动画图片资源:
自此,一个语音动画的Dialog就已经完成了,那么我们下面继续真正录音的逻辑吧。
private MediaRecorder mediaRecorder; private String mDir; private String mFilePath; public void prepareAudio() {//录音准备 try { File dir = new File(mDir); if (!dir.exists()) { dir.mkdirs();//先检查和创建目录 } //文件名例:x8n232iej2e3u4h35hj453.amr String fileName = getFileName();//这里用时间戳或者UUID当做文件名 File file = new File(dir, fileName);//这里dir获取手机内存或者SD卡路径 mFilePath = file.getAbsolutePath(); mediaRecorder = new MediaRecorder(); //设置输出位置 mediaRecorder.setOutputFile(file.getAbsolutePath()); //设置麦克风为音源 mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); //设置音频格式 mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR); //设置音频编码amr mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); //准备 mediaRecorder.prepare(); //开始 mediaRecorder.start(); } catch (Exception e) { e.printStackTrace(); //这里mediaRecorder会抛出异常,我们需要捕获,否则造成崩溃。 } }
停止录音时释放资源:
/** * 释放 */ public void release() { if (mediaRecorder != null) { mediaRecorder.stop(); mediaRecorder.release(); mediaRecorder = null; } }
有时候在录音不足1秒或者我们需要取消,我们需要删除取消的文件,所以再定义一个取消函数:
/** * 取消 */ public void cancel() { release(); if (mFilePath != null) { File file = new File(mFilePath); file.delete(); mFilePath = null; } }
上述代码会把录音文件输出到我们指定的文件路径下,我们只需记录这个路径,然后播放就行了,对了,最后记得加上录音所需权限:
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
相关文章推荐
- [置顶] 在Android中使App快速、简单地支持新浪微博、微信、QQ、facebook等十几个主流社交平台的分享功能
- Android模仿微信语音聊天功能
- QQ 不也有语音功能吗,为什么微信会有市场?
- android仿微信聊天页面,以及实现语音功能
- android仿微信聊天界面 语音录制功能
- 在Android中使App快速、简单地支持新浪微博、微信、QQ、facebook等十几个主流社交平台的分享功能
- Android 高仿微信(QQ)滑动弹出编辑、删除菜单效果,增加下拉刷新功能
- android 仿QQ,微信群组里的@功能,支持@多人,并能一键删除,能获取上传对应的id
- android实现微信语音功能
- android 仿微信聊天界面,以及语音录制功能
- android 仿微信聊天界面,以及语音录制功能
- Android仿微信语音聊天功能
- Android模仿微信语音聊天功能-IT蓝豹
- Android 微信分享与QQ分享功能
- 在Android中使App快速、简单地支持新浪微博、微信、QQ、facebook等十几个主流社交平台的分享功能
- Android模仿微信语音聊天功能
- Android仿微信语音聊天功能
- 关于android微信QQ等平台分享功能实现中遇到的问题处理
- android 微信 以及QQ的SDK接入分享功能遇到的些问题小结
- Android仿微信QQ设置图形头像裁剪功能