• Android初级教程实现电话录音


    需求:设置来电后自动录音。

    首先设置一个按钮,代码很简单这里就不再给出。

    建一个类,RecorderServicer extends Service

    package com.ydl.recorder;
    
    import java.io.IOException;
    
    import android.app.Service;
    import android.content.Intent;
    import android.media.MediaRecorder;
    import android.os.IBinder;
    import android.telecom.TelecomManager;
    import android.telephony.PhoneStateListener;
    import android.telephony.TelephonyManager;
    
    public class RecorderServicer 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);
    		//监听电话状态
    		tm.listen(new MyListener(), PhoneStateListener.LISTEN_CALL_STATE);
    
    	}
    
    	class MyListener extends PhoneStateListener {
    		@Override
    		public void onCallStateChanged(int state, String incomingNumber) {
    			// TODO Auto-generated method stub
    			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();
    					recorder.setAudioSource(MediaRecorder.AudioSource.MIC);// Microphone
    																			// audio
    																			// source
    					recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);// 设置输出3gp格式
    					recorder.setOutputFile("sdcard/luyin.3gp");
    					recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);// 设置音频编码格式
    					try {
    						recorder.prepare();// 做好准备
    					} catch (Exception e) {
    						// TODO Auto-generated catch block
    						e.printStackTrace();
    					}
    				}
    
    				break;
    			case TelephonyManager.CALL_STATE_OFFHOOK:
    				System.out.println("摘机");
    
    				// 开始录音
    				if (recorder != null) {
    					recorder.start();
    				}
    			default:
    				break;
    			}
    		}
    	}
    
    }
    

    在主活动界面设置按钮点击事件:用于启动上述服务

    package com.ydl.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, RecorderServicer.class);
        	startService(intent);
        	
        }
    }
    
    为了做的更逼真一些,设置开机启动服务:因此用到了上一章的开机广播机制

    新建一个类:BootReceiver extends BroadcastReceiver   用于开机启动服务。因为服务是在后台的,不可见面,因此不必设置任务栈即不需要addFlags()方法

    package com.ydl.recorder;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    
    public class BootReceiver extends BroadcastReceiver {
    	
    	//设置开机启动服务
    
    	@Override
    	public void onReceive(Context context, Intent intent) {
    		Intent it = new Intent(context, RecorderServicer.class);
    		context.startService(it);
    
    	}
    
    }
    

    上述代码都是对系统进行操作,例如:监听电话状态、设置开机广播、写出数据到SDcard、设置录音方式。因此需要配置权限,同时上边的而广播和服务都要进行相应的配置。

    清单文件的权限和服务广播注册如下:

     <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
        <uses-permission android:name="android.permission.RECORD_AUDIO"/>
     
        <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <service android:name="com.ydl.recorder.RecorderServicer"></service>
            <receiver android:name="com.ydl.recorder.BootReceiver">
                <intent-filter >
                    <action android:name="android.intent.action.BOOT_COMPLETED"/>
                </intent-filter>
            </receiver>


  • 相关阅读:
    js中取整数的方法
    js中原型和原型链
    js中获取class封装
    Cocos2dx打包成apk包时在手机上闪退
    计算两个日期间相差的天数
    Stealing a Cake [函数方程符合凸性 三分]
    插件式架构设计(转)
    转:Entity FrameWork利用Database.SqlQuery<T>执行存储过程并返回参数
    后台web请求代码(含https,json提交)
    sitecore 缓存管理器
  • 原文地址:https://www.cnblogs.com/wanghang/p/6299673.html
Copyright © 2020-2023  润新知