摇一摇手机控制手机录音功能

来源:互联网 发布:欧文总决赛第七战数据 编辑:程序博客网 时间:2024/05/16 01:06

学完传感器的知识之后,才发现传感器的实现也是特别容易的,我们可以在它的监听事件中进行一系列的功能处理。

创建的基本步骤是

1,在onCreate中获取SensorManager实例

sensorManager=(SensorManager) getSystemService(SENSOR_SERVICE);

2,在onResume中注册监听

sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
,SensorManager.SENSOR_DELAY_UI);

3,在监听器的回调方法中获取对应的传感器的x,y,x三个点的数据

onSensorChanged: 

  float [] values=event.values;
if(event.sensor.getType()==Sensor.TYPE_ACCELEROMETER) {
float x=event.values[0];
float y=event.values[1];
float z=event.values[2];}

4,一定记得在最后取消注册,因为传感器开启后是特别耗电的,如果不及时关闭会带来很不好的用户体验

sensorManager.unregisterListener(this);



在这个项目中我遇到的问题是我的录音功能只能够录制一次,后来我发现问题就是我在播放录音的时候没有将MediaPlayer对象设为空,当然在开是播放时还得加一下判断一下MediaPlayer对象是否为空,为空就创建这个对象。


最终的效果就是:当你摇第一下的时候文本会变为开始录音,摇第二下是结束录音,在点击播放时会播放录音。在摇一摇的力度控制我设置了固定的数据,通过测试会有基本的效果,但是我就的这个设死的数据不够灵活,有时候摇一摇并没有改变文本,希望有人能帮我解决这个问题。


最后我附上项目的源码


public class MainActivity extends Activity implements SensorEventListener{private TextView tv;private int i=0;private SensorManager sensorManager;private MediaRecorder mediaRecorder;private MediaPlayer mediaPlayer;public void play(View view){String path=Environment.getExternalStorageDirectory().getAbsolutePath()+"/fofo.amr";try {mediaPlayer.setDataSource(path);mediaPlayer.prepare();mediaPlayer.start();mediaPlayer=null;   <span style="font-family: Arial, Helvetica, sans-serif;">这里是为了可以反复录音,就需要把之前的对象给设为空</span>} catch (Exception e) {e.printStackTrace();}}@Overrideprotected void onResume() {sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION),SensorManager.SENSOR_DELAY_UI);super.onResume();}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tv=(TextView)findViewById(R.id.tv);sensorManager=(SensorManager) getSystemService(SENSOR_SERVICE);}@Overrideprotected void onStop() {// TODO Auto-generated method stubsensorManager.unregisterListener(this);super.onStop();}@Overridepublic void onSensorChanged(SensorEvent event) {// TODO Auto-generated method stubfloat [] values=event.values;if(event.sensor.getType()==Sensor.TYPE_LINEAR_ACCELERATION) {float x=event.values[0];float y=event.values[1];float z=event.values[2];int index=8;int id=10;if((x>index||y>index||z>index)&&i==0){   //开始录音的数据我设置的比较小tv.setText("开始录音");if(mediaPlayer==null){    这里是为了可以反复录音,就需要把之前的对象给设为空mediaPlayer = new MediaPlayer();}mediaRecorder=new MediaRecorder();mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);mediaRecorder.setOutputFile(Environment.getExternalStorageDirectory().getAbsolutePath()+"/fofo.amr"); 音频放在位置sd卡中try {mediaRecorder.prepare();} catch (Exception e) {e.printStackTrace();}mediaRecorder.start();i=1;}if((x>id||y>id||z>id)&&i==1){tv.setText("结束录音");mediaRecorder.stop();mediaRecorder.release();i=0;}}}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {// TODO Auto-generated method stub}}



0 0
原创粉丝点击