zoukankan      html  css  js  c++  java
  • Android简易实战教程--第三十六话《电话录音》

    今天完成一个简单的电话录音功能,即接通电话后,立即录下自己打电话的声音。实现起来比较简单:一个服务,一个TelephonyManager、一个MediaRecorder就够了。

    1、布局提供一个开启录音服务的按钮。

    2、服务里面代码如下:(代码详细解释都在里面了)

    package com.itydl.recorder;
    
    import android.app.Service;
    import android.content.Intent;
    import android.media.MediaRecorder;
    import android.os.IBinder;
    import android.telephony.PhoneStateListener;
    import android.telephony.TelephonyManager;
    
    public class RecorderService extends Service {
    	private MediaRecorder recorder;
    	@Override
    	public IBinder onBind(Intent intent) {
    		return null;
    	}
    
    	@Override
    	public void onCreate() {
    		super.onCreate();
    		//拿到电话管理器
    		TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
    		//监听电话状态
    		//events:决定PhoneStateListener侦听什么内容,如:LISTEN_SIGNAL_STRENGTHS表示这个监听器监听信号强弱改变
    		tm.listen(new MyListener(), PhoneStateListener.LISTEN_CALL_STATE);
    	}
    	
    	class MyListener extends PhoneStateListener{
    		//一旦电话状态改变,此方法调用
    		@Override
    		public void onCallStateChanged(int state, String incomingNumber) {
    			super.onCallStateChanged(state, incomingNumber);
    			
    			switch (state) {
    			case TelephonyManager.CALL_STATE_IDLE:
    				System.out.println("空闲");
    				if(recorder != null){
    					//结束录音、释放资源
    					recorder.stop();
    					recorder.release();
    					recorder = null;
    				}
    				break;
    			case TelephonyManager.CALL_STATE_RINGING:
    				System.out.println("响铃");
    				//初始化录音机
    				if(recorder == null){
    					recorder = new MediaRecorder();
    					//设置来源,默认麦克风MIC
    					recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    					//设置输出格式,3GP
    					recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    					//文件名称,录到哪里以及录下后的音频名称,因为上边输出格式使用3gp,因此使用.3gp作为后缀名
    					recorder.setOutputFile("sdcard/luyin.3gp");
    					//音频编码
    					recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    					try {
    						//准备。之后就可以开始录音了
    						recorder.prepare();
    					} catch (Exception e) {
    						e.printStackTrace();
    					}
    				}
    				break;
    			case TelephonyManager.CALL_STATE_OFFHOOK:
    				System.out.println("摘机");
    				//开始录音
    				if(recorder != null){
    					recorder.start();
    				}
    				break;
    
    			}
    		}
    		
    	}
    	
    }
    

    而主活动里面的代码就是点击事件,开启这个录音服务。

    package com.itydl.recorder;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.content.Intent;
    import android.view.Menu;
    import android.view.View;
    
    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
    
        public void click(View v){
        	Intent intent = new Intent(this, RecorderService.class);
        	startService(intent);
        }
    }
    
    电话录音功能,需要配置一些权限,如下:

    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
      <!-- 录音权限 -->
      <uses-permission android:name="android.permission.RECORD_AUDIO" />

    当然、服务一定要记得载清单文件完成配置

    <service android:name="com.itydl.recorder.RecorderService"></service>

    运行案例,给我们的手机或者模拟器打个电话,接听聊几句,我们会发现在sdcard根目录多了一个叫luyin.3gp的音频文件。这样,一个简易的录音功能就完毕了~~

  • 相关阅读:
    cqyz oj | 单峰排列
    cqyz oj/uva 548 | 二叉树
    cqyz oj | 树网的核 | 树的直径
    cqyz oj | 树上的询问 | 最近公共祖先
    cqyz oj | 循环逆序对 | 逆序对 | 树状数组
    cqyz oj | 潜水比赛 | 贪心
    YOLO v3 & Pascal VOC数据集
    太阳爆发分类
    PPT制作
    anaconda
  • 原文地址:https://www.cnblogs.com/wanghang/p/6299553.html
Copyright © 2011-2022 走看看