Android实现通话呼叫转移与监听通话录音功能

原创 2016年08月28日 23:35:52

一、呼叫转移功能。

呼叫转移CF(Call Forwarding,呼叫转移),是电信业一项传统通信业务,又称呼叫前转、呼入转移。如果您的电话无法接听或您不愿接电话,可以将来电转移到其它电话号码上。

我们知道,手机设置呼叫转移时,有这么以下几种设置方式:

无条件转移】设定:*57*电话号码#   取消:#57#
【无应答转移】设定:*41*电话号码#   取消:#41#   

【遇忙转移】 设定:*40*电话号码#   取消:#40#   
“设定”或“取消”时输完 号码 和 符号 后按【呼叫】键,如果登记成功,则听到语音提示“您的业务已受理”,完成;  如果取消成功,则听到语音提示“您的业务已受理”,完成。
GSM手机呼叫转移设置方法  
【无条件转移】设定:**21*电话号码#  取消:##21#   
【无应答转移】设定:**61*电话号码#  取消:##61#   
【遇忙转移】 设定:**67*电话号码#  取消:##67# CDMA手机呼叫转移设置方法  
【无条件转移】设定:*72电话号码   取消:*720   
【无应答转移】设定:*92电话号码   取消:*920   
【遇忙转移】 设定:*90电话号码   取消:*900
具体到代码中实现,也是需要判断呼叫转移的类型,并设置其类型,关键代码如下:
case R.id.change: // 转移
			if (phoneNum != null && phoneNum.length() > 0) {
				if (IsValidMobileNo(phoneNum)) {
					intent = new Intent();
					intent.setAction(Intent.ACTION_CALL);
					if (changeType == 0) {
						intent.setData(Uri
								.parse("tel:**21*" + phoneNum + "%23")); // 始终进行呼叫转移
					} else if (changeType == 1) {
						intent.setData(Uri
								.parse("tel:**67*" + phoneNum + "%23")); // 占线时进行呼叫转移
					} else if (changeType == 2) {
						intent.setData(Uri
								.parse("tel:**61*" + phoneNum + "%23")); // 无应答时进行呼叫转移
					} else if (changeType == 3) {
						intent.setData(Uri
								.parse("tel:**62*" + phoneNum + "%23")); // 无法接通时进行呼叫转移
					}
					startActivity(intent);
				} else {
					Toast.makeText(this, getString(R.string.app_name08),
							Toast.LENGTH_SHORT).show();
				}
			} else {
				Toast.makeText(this, getString(R.string.app_name07),
						Toast.LENGTH_SHORT).show();
			}
			break;
这是当点击呼叫转移时,判断下拉选项的类型,并进行呼叫转移功能的。
需要的几个权限如下:

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
监听通话状态,并拨打电话的权限。

二、监听通话,并录音功能。

对于监听通话记录,需要开启服务TelephonyManager得到服务Context.TELEPHONY_SERVICE。注册监听器,对电话进行监听PhoneStateListener.LISTEN_CALL_STATE


public void onCreate() {
		super.onCreate();
		Log.i("TAG", "服务启动了");
		mContext = getApplicationContext();
		
		// 对电话的来电状态进行监听
		TelephonyManager telManager = (TelephonyManager) this
				.getSystemService(Context.TELEPHONY_SERVICE);
		// 注册一个监听器对电话状态进行监听
		telManager.listen(new MyPhoneStateListener(),
				PhoneStateListener.LISTEN_CALL_STATE);
	}

private class MyPhoneStateListener extends PhoneStateListener {
		MediaRecorder recorder;
		File audioFile;
		String phoneNumber;

		public void onCallStateChanged(int state, String incomingNumber) {
			switch (state) {
			case TelephonyManager.CALL_STATE_IDLE: /* 无任何状态时 */
				if (recorder != null) {
					recorder.stop(); // 停止刻录
					recorder.reset(); // 重设
					recorder.release(); // 刻录完成一定要释放资源
				}
				break;
			case TelephonyManager.CALL_STATE_OFFHOOK: /* 接起电话时 */

				try {
					recorder = new MediaRecorder();
					recorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 设置音频采集原
					recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); // 内容输出格式
					recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); // 音频编码方式

					// recorder.setOutputFile("/sdcard/myvoice.amr");
					String rootPath;
					// 判断外部存储器是否存在
					if (android.os.Environment.getExternalStorageState().equals(
							android.os.Environment.MEDIA_MOUNTED)) {
						// 外部存储器存在,返回其目录
						// Environment.getExternalStorageDirectory().getAbsolutePath();
						rootPath = Environment.getExternalStorageDirectory().getPath();
					} else {
						rootPath = mContext.getFilesDir().getPath();
					}
					


					StringBuilder fileName = new StringBuilder();
					fileName.append(incomingNumber).append("_")
							.append(System.currentTimeMillis() + "")
							.append(".amr");

					String path = rootPath + File.separator
							+ fileName.toString();
					
					Log.i("TAG", path + "");

					recorder.setOutputFile(path);

					//Log.i("TAG", audioFile.getAbsolutePath());

					recorder.prepare(); // 预期准备
					recorder.start();

				} catch (IllegalStateException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}

				break;
			case TelephonyManager.CALL_STATE_RINGING: /* 电话进来时 (来电铃响时)*/
				phoneNumber = incomingNumber;
				OutputStream os = null;
				try{
					os = openFileOutput("phoneList",MODE_APPEND);
				}catch(FileNotFoundException e){
					e.printStackTrace();
				}
				PrintStream ps = new PrintStream(os);
				//将来电号码记录到文件中
				ps.println("时间:"+new Date()+" 来电: " + phoneNumber);
				ps.close();
				break;
			default:
				break;
			}
			super.onCallStateChanged(state, incomingNumber);
		}
	}

完整代码,可以看我写的简单例子:http://download.csdn.net/detail/chijicheng/3168543



版权声明:本文为博主原创文章,未经博主允许不得转载。

我的Android进阶之旅------>四种呼叫转移场景

运行商为我们提供了如下4中呼叫转移场景: 1、始终进行呼叫转移:不管当前手机处于何种状态,来电都会被转移到指定的电话号码上。在使用这种呼叫转移时应当非常小心,如果启用了这种呼叫转移,你可就永远也接...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Android实现电话录音功能

需求分析 电话录音是在通话的时候进行录音,所以需要使用一个服务来完成功能。 需要监听电话的状态,分为三种状态: 空闲状态 TelephonyManager.CALL_STATE_IDLE 响铃状态 ...
  • Easzz
  • Easzz
  • 2015年12月07日 00:21
  • 2101

使用ACR及MIUI自带通话录音实现通话录音读取及上传

虽然在Android5.0之前在AudioRecord开放给第三方的初始化方法中VOICE_CALL音频源是可以使用的,但是在厂商的适配过程中很多还是不能用,因此在低版本中一直是通过AudioReco...
  • tream0
  • tream0
  • 2017年03月30日 14:26
  • 684

Android实训案例(七)——四大组件之一Service初步了解,实现通话录音功能,抽调接口

标签: android 2016-04-10 21:42 1765人阅读 评论(0) 收藏 举报 本文章已收录于:   Android知识库  分类: Andro...

Android实训案例(七)——四大组件之一Service初步了解,实现通话录音功能,抽调接口

本文转自:  Android实训案例(七)——四大组件之一Service初步了解,实现通话录音功能,抽调接口 Service Service的神奇之处,在于他不需要界面,...

Android 通话录音功能实现

通话录音作为手机的基本功能

Android实训案例(七)——四大组件之一Service初步了解,实现通话录音功能,抽调接口

Service的神奇之处,在于他不需要界面,一切的操作都在后台操作,所以很多全局性(手机助手,语音助手)之类的应用很长需要这个,我们今天也来玩玩 我们新建一个工程——ServiceD...

Android实训案例(七)——四大组件之一Service初步了解,实现通话录音功能,抽调接口

Service Service的神奇之处,在于他不需要界面,一切的操作都在后台操作,所以很多全局性(手机助手,语音助手)之类的应用很长需要这个,我们今天也来玩玩 我们新建一个工程——Se...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android实现通话呼叫转移与监听通话录音功能
举报原因:
原因补充:

(最多只允许输入30个字)