简单的录音功能,通过图片切换实现声音大小的显示
来源:互联网 发布:php 统计文章浏览次数 编辑:程序博客网 时间:2024/05/17 14:17
简单的记录下一个录音功能,通过切换图片实现声音大小的变化。记得增加权限
RECORD_AUDIO
package com.bigzone.zuoyou.reception.service;import android.app.Service;import android.content.Intent;import android.media.MediaRecorder;import android.os.Binder;import android.os.Environment;import android.os.Handler;import android.os.IBinder;import android.util.Log;import com.bigzone.zuoyou.utils.CommonUtil;import java.io.File;import java.io.IOException;import java.util.Random;/** * Created by haohongwei on 2017/8/4. */public class RecordService extends Service { private static String TAG = "RecordService"; private MediaRecorder recorder; private String path; public double db = 0; public class MyBinder extends Binder { public RecordService getService() { return RecordService.this; } } //通过binder实现了 调用者(client)与 service之间的通信 private MyBinder binder = new MyBinder(); private final Random generator = new Random(); @Override public void onCreate() { super.onCreate(); } @Override public IBinder onBind(Intent intent) { startRecord(intent.getStringExtra("name")); return binder; } @Override public boolean onUnbind(Intent intent) { stopRecord(); return false; } @Override public int onStartCommand(Intent intent, int flags, int startId) { return START_NOT_STICKY; } @Override public void onDestroy() { super.onDestroy(); } //在Service中暴露出去的方法,供client调用 public double getRandomNumber() { return db; } private void stopRecord() { if (recorder != null) { recorder.stop(); recorder.release(); recorder = null; } } private void startRecord(String name) { path = CommonUtil.getSDPath() + "/voice/" + name + ".amr"; recorder = new MediaRecorder(); recorder.setAudioSource(MediaRecorder.AudioSource.MIC); recorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); recorder.setOutputFile(path); try { recorder.prepare(); recorder.start(); } catch (IOException e) { e.printStackTrace(); } updateMicStatus(); } /** * 更新话筒状态 */ private int BASE = 1; private int SPACE = 100;// 间隔取样时间 private void updateMicStatus() { if (recorder != null) { double ratio = (double) recorder.getMaxAmplitude() / BASE; db = 0;// 分贝 if (ratio > 1) db = 20 * Math.log10(ratio); mHandler.postDelayed(mUpdateMicStatusTimer, SPACE); } } private final Handler mHandler = new Handler(); private Runnable mUpdateMicStatusTimer = new Runnable() { public void run() { updateMicStatus(); } };}
package com.bigzone.zuoyou.reception.activity;import android.Manifest;import android.content.ComponentName;import android.content.Intent;import android.content.ServiceConnection;import android.content.pm.PackageManager;import android.os.Handler;import android.os.IBinder;import android.support.v4.app.ActivityCompat;import android.support.v4.content.ContextCompat;import android.util.Log;import android.view.View;import android.widget.AdapterView;import android.widget.CheckBox;import android.widget.Chronometer;import android.widget.CompoundButton;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.ListView;import android.widget.TextView;import com.bigzone.zuoyou.R;import com.bigzone.zuoyou.common.BaseActivity;import com.bigzone.zuoyou.reception.adapter.RecordAdapter;import com.bigzone.zuoyou.reception.bean.RecordEntity;import com.bigzone.zuoyou.reception.service.RecordService;import com.bigzone.zuoyou.utils.CommonUtil;import com.bigzone.zuoyou.utils.Logger;import java.io.File;import java.util.ArrayList;import java.util.List;import butterknife.BindView;import butterknife.ButterKnife;import butterknife.OnClick;/** * Created by haohongwei on 2017/8/8. */public class ReceptionMainActivity extends BaseActivity implements CompoundButton.OnCheckedChangeListener, Chronometer.OnChronometerTickListener, AdapterView.OnItemClickListener { @BindView(R.id.tv_title) TextView tv_title; @BindView(R.id.tv_top_right) TextView tv_histroy; @BindView(R.id.cm_time) Chronometer cm_time; @BindView(R.id.cb_start) CheckBox cb_start; @BindView(R.id.iv_voice) ImageView iv_voice; @BindView(R.id.listView) ListView listView; private List<RecordEntity> list = new ArrayList<>(); private RecordService bindService; private RecordAdapter recordAdapter; private boolean isBound = false; private int miss = 0; private static int REQ_CODE_PERMISSION = 1001; private long name; @BindView(R.id.ll_empty) LinearLayout ll_empty; @Override protected int bindLayout() { return R.layout.activity_reception_main; } @Override protected void initView() { ButterKnife.bind(this); tv_histroy.setText("历史接待"); tv_title.setText("接待"); tv_histroy.setVisibility(View.VISIBLE); cb_start.setOnCheckedChangeListener(this); cm_time.setOnChronometerTickListener(this); cm_time.setText(FormatMiss(0)); if (ContextCompat.checkSelfPermission(ReceptionMainActivity.this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(ReceptionMainActivity.this, new String[]{Manifest.permission.RECORD_AUDIO}, REQ_CODE_PERMISSION); } if (ContextCompat.checkSelfPermission(ReceptionMainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(ReceptionMainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQ_CODE_PERMISSION); } File file = new File(CommonUtil.getSDPath() + "/voice"); if (!file.exists()) { file.mkdir(); } recordAdapter = new RecordAdapter(list, this); listView.setAdapter(recordAdapter); listView.setEmptyView(ll_empty); listView.setOnItemClickListener(this); initData(); } private void initData() { list.add(new RecordEntity(0, "录音0", "2017-08-08 10:00-10:20", "新街口店张小姐")); list.add(new RecordEntity(1, "录音1", "2017-08-08 16:00-16:20", "常府街店张小姐")); list.add(new RecordEntity(2, "录音2", "2017-08-08 19:00-19:20", "夫子庙店张小姐")); list.add(new RecordEntity(3, "录音3", "2017-08-08 20:00-20:30", "张府园店张小姐")); list.add(new RecordEntity(4, "录音4", "2017-08-08 22:10-22:24", "新街口店李小姐")); recordAdapter.notifyDataSetChanged(); } private ServiceConnection conn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { isBound = true; RecordService.MyBinder binder = (RecordService.MyBinder) service; bindService = binder.getService(); updateMicStatus(); } //client 和service连接意外丢失时,会调用该方法 @Override public void onServiceDisconnected(ComponentName name) { Log.v("hjz", "onServiceDisconnected A"); } }; @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { Intent intent = null; if (isChecked) { cb_start.setText("结束接待"); intent = new Intent(ReceptionMainActivity.this, RecordService.class); name = System.currentTimeMillis(); intent.putExtra("name", name + ""); bindService(intent, conn, BIND_AUTO_CREATE); cm_time.start(); } else { cb_start.setText("开始接待"); if (isBound) { isBound = false; unbindService(conn); } miss = 0; cm_time.stop(); Logger.d("name", "name : " + name + ".amr");// File file = new File(CommonUtil.getSDPath() + "/voice/" + name + ".amr");// 修改名字// File newF = new File(CommonUtil.getSDPath() + "/voice/" + "修改名字" + ".amr");// file.renameTo(newF);//// 删除文件// file.delete(); } } /** * 更新话筒状态 */ private int SPACE = 100;// 间隔取样时间 private void updateMicStatus() {// tv_time.setText("分贝:" + bindService.getRandomNumber()); setImageView(bindService.getRandomNumber()); mHandler.postDelayed(mUpdateMicStatusTimer, SPACE); } private void setImageView(double randomNumber) { if (randomNumber > 75) { iv_voice.setImageResource(R.drawable.voice_10); } else if (randomNumber > 65) { iv_voice.setImageResource(R.drawable.voice_8); } else if (randomNumber > 55) { iv_voice.setImageResource(R.drawable.voice_6); } else if (randomNumber > 45) { iv_voice.setImageResource(R.drawable.voice_4); } else if (randomNumber > 35) { iv_voice.setImageResource(R.drawable.voice_2); } else { iv_voice.setImageResource(R.drawable.voice_0); } } private final Handler mHandler = new Handler(); private Runnable mUpdateMicStatusTimer = new Runnable() { public void run() { updateMicStatus(); } }; @Override public void onChronometerTick(Chronometer chronometer) { miss++; chronometer.setText(FormatMiss(miss)); } // 将秒转化成小时分钟秒 public String FormatMiss(int miss) { String hh = miss / 3600 > 9 ? miss / 3600 + "" : "0" + miss / 3600; String mm = (miss % 3600) / 60 > 9 ? (miss % 3600) / 60 + "" : "0" + (miss % 3600) / 60; String ss = (miss % 3600) % 60 > 9 ? (miss % 3600) % 60 + "" : "0" + (miss % 3600) % 60; return hh + ":" + mm + ":" + ss; } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { changeActivity(ReceptionDetailActivity.class); } @OnClick(R.id.iv_back) void back() { finish(); }}
阅读全文
0 0
- 简单的录音功能,通过图片切换实现声音大小的显示
- 实现录音时随声音大小变化的UI,以及文件上传功能。
- android 通过MediaRecorder实现简单的录音
- Unity简单的声音切换渐变实现
- Android 实现简单的录音功能
- ios-录音功能的简单实现
- IOS 录音的时候 监测声音大小并显示出来当前声音大小 可播放(超级简陋版)
- 通过CSS控制图片显示的大小
- 通过J2ME的录音功能实现简易示波器
- 通过J2ME的录音功能实现简易示波器
- 通过J2ME的录音功能实现简易示波器
- 通过J2ME的录音功能实现简易示波器
- android AudioRecord录音时调节录音声音的大小
- 简单方法实现webbrowser不显示图片flash的功能。
- BCB里用MCI实现简单的录音功能
- Android开发--WebView简单录音功能的实现
- ios录音功能的实现
- iOS 录音功能的实现
- 多进程 队列 实现生产者消费者模型 python 笔记
- 2017.10.1学习(1)
- Java解析Json数据
- 搭建及使用K8s集群 <使用ingress 暴露springcloud服务>
- idea .java文件 右下角有个红色 j 的解决方法
- 简单的录音功能,通过图片切换实现声音大小的显示
- java 空指针异常
- 优秀工程师-UIScrollView UIPageControl
- 【坐在马桶上看算法】算法1 最快最简单的排序——桶排序
- 《高性能MySQL》读书笔记--Schema与数据类型优化
- shell脚本极简教程-转载自架构师小密圈
- Spark 及 Hadoop 开发员培训通知:含北京、上海、深圳3个站
- Linux 中配置oracle 自启动
- QString与LPCWSTR 带中文的相互转换