`
stephen830
  • 浏览: 3010997 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

android 来电自动接听和自动挂断

 
阅读更多

android 来电自动接听和自动挂断

 

 

注意:android2.3版本不支持下面的自动接听方法。(会抛异常:java.lang.SecurityException: Neither user xxxxx nor current process has android.permission.MODIFY_PHONE_STATE.)

 

 

第一步:准备应用环境需要的系统包和aidl文件。

 

(1)在应用中创建包:android.telephony

将android系统框架下的\framework\telephony\java\android\telephony目录中的NeighboringCellInfo.aidl文件复制到上面创建的包(android.telephony )中;

(2)在应用中创建包:com.android.internal.telephony

将android系统框架下的\framework\telephony\java\com\android\internal\telephony目录中的ITelephony.aidl文件复制到上面创建的包(com.android.internal.telephony )中;

 

 

第二步:创建一个获取ITelephony的方法

PhoneUtils.java

package com.zhouzijing.android.demo;

import java.lang.reflect.Method;
import com.android.internal.telephony.ITelephony;
import android.telephony.TelephonyManager;

public class PhoneUtils {
	/**
	 * 根据传入的TelephonyManager来取得系统的ITelephony实例.
	 * @param telephony
	 * @return 系统的ITelephony实例
	 * @throws Exception
	 */
	public static ITelephony getITelephony(TelephonyManager telephony) throws Exception { 
        Method getITelephonyMethod = telephony.getClass().getDeclaredMethod("getITelephony"); 
        getITelephonyMethod.setAccessible(true);//私有化函数也能使用 
        return (ITelephony)getITelephonyMethod.invoke(telephony); 
    }
}
 

第三步:创建电话广播拦截器

MyPhoneBroadcastReceiver.java

package com.zhouzijing.android.demo;

import com.android.internal.telephony.ITelephony;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.TelephonyManager;
import android.util.Log;

public class MyPhoneBroadcastReceiver extends BroadcastReceiver {

	private final static String TAG = MyPhone.TAG;
	
	@Override
	public void onReceive(Context context, Intent intent) {
		String action = intent.getAction();
		Log.i(TAG, "[Broadcast]"+action);
		
		//呼入电话
		if(action.equals(MyPhone.B_PHONE_STATE)){
			Log.i(TAG, "[Broadcast]PHONE_STATE");
			doReceivePhone(context,intent);
		}
	}
	
	/**
	 * 处理电话广播.
	 * @param context
	 * @param intent
	 */
	public void doReceivePhone(Context context, Intent intent) {
		String phoneNumber = intent.getStringExtra(
TelephonyManager.EXTRA_INCOMING_NUMBER);
		TelephonyManager telephony = (TelephonyManager)context.getSystemService(
Context.TELEPHONY_SERVICE);
		int state = telephony.getCallState();
		
		switch(state){
		case TelephonyManager.CALL_STATE_RINGING:
			Log.i(TAG, "[Broadcast]等待接电话="+phoneNumber);
			try {
				ITelephony iTelephony = PhoneUtils.getITelephony(telephony);
				iTelephony.answerRingingCall();//自动接通电话
				//iTelephony.endCall();//自动挂断电话
			} catch (Exception e) {
				Log.e(TAG, "[Broadcast]Exception="+e.getMessage(), e);
			}
			break;
		case TelephonyManager.CALL_STATE_IDLE:
			Log.i(TAG, "[Broadcast]电话挂断="+phoneNumber);
			break;
		case TelephonyManager.CALL_STATE_OFFHOOK:
			Log.i(TAG, "[Broadcast]通话中="+phoneNumber);
			break;
		}
	}

}
 

 

第四部:注册电话广播拦截器

MyPhone.java

package com.zhouzijing.android.demo;

import android.app.Activity;
import android.content.IntentFilter;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.View;

public class MyPhone extends Activity {
	public final static String TAG = "MyPhone";
	
	public final static String B_PHONE_STATE = TelephonyManager.ACTION_PHONE_STATE_CHANGED;
	
	private MyPhoneBroadcastReceiver mBroadcastReceiver;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.my_phone);
	}
	
	//按钮1-注册广播
	public void registerThis(View v) {
		Log.i(TAG, "registerThis");
		mBroadcastReceiver = new MyPhoneBroadcastReceiver();
		IntentFilter intentFilter = new IntentFilter();
		intentFilter.addAction(B_PHONE_STATE);
		intentFilter.setPriority(Integer.MAX_VALUE);
		registerReceiver(mBroadcastReceiver, intentFilter);
	}
	
	//按钮2-撤销广播
	public void unregisterThis(View v) {
		Log.i(TAG, "unregisterThis");
		unregisterReceiver(mBroadcastReceiver);
	}
	
}
 

第5步:在AndroidManifest.xml配置权限

    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
    <uses-permission android:name="android.permission.CALL_PHONE"/>
 

其中:

iTelephony.answerRingingCall();//自动接通电话

 必须有权限 android.permission.MODIFY_PHONE_STATE

 

iTelephony.endCall();//自动挂断电话

 必须有权限 android.permission.CALL_PHONE

 

 

 

 

 

 

 

分享到:
评论
4 楼 qyqingyan 2015-01-13  
不明白为什么?
3 楼 qyqingyan 2015-01-13  
有时起作用,有时不起作用!
2 楼 dpf110120 2014-08-04  
兄弟,我用这个代码发现在三星i869手机上,使用自动挂断endCall方法,返回全是false,挂断失败,请问您碰到过这个情况吗?

另你这个代码在什么型号的手机上测试通过的?
1 楼 zw0218zw 2014-05-09  
我按照您说的步骤结果:import android.telephony.CellInfo;找不到提示错误:couldn't find import for class android.telephony.CellInfo,请问怎么解决。

相关推荐

    Android应用源码之 实现自动接听和挂断电话功能).zip

    在Android应用开发中,实现自动接听和挂断电话的功能是一个高级话题,涉及到系统级权限、来电监听和服务等关键概念。这个源码项目提供了一个实际的示例,可以帮助开发者理解和掌握这些技术。 首先,我们要理解...

    实现自动接听和挂断电话功能

    在Android平台上,实现自动接听和挂断电话的功能主要涉及到电话管理和服务组件的使用。这个功能在某些场景下非常有用,比如在驾驶时自动接听电话,或者在自动化测试中模拟用户行为。下面我们将深入探讨如何在Android...

    安卓开发-Android 实现自动接听和挂断电话功能.zip.zip

    综上所述,实现自动接听和挂断电话功能在Android开发中是一项涉及多个层面的任务,需要对Android系统的电话服务有深入的理解,并且正确处理权限和系统交互。同时,考虑到用户体验和安全性,开发者应谨慎并合法地运用...

    安卓Android源码——实现自动接听和挂断电话功能.zip

    在安卓(Android)平台上,开发一个能够自动接听和挂断电话的应用程序涉及到多个核心知识点,这些功能通常是通过监听系统的电话状态来实现的。本项目提供的源码深入展示了如何利用Android的电话管理和广播接收器机制...

    Android自动接听电话程序

    在Android平台上,开发一个自动接听电话的程序涉及到多个核心知识点,包括权限管理、来电监听、系统服务、广播接收器以及电话API的使用。下面将详细阐述这些关键点。 首先,**权限管理**是Android应用程序的基础,...

    Android如何帮助用户自动接听或者挂断来电

    Android系统中,自动接听或者挂断来电是非常有用的功能,特别是在自动化操作和效率提升方面。下面我们将详细介绍如何使用Android实现自动接听或者挂断来电的功能。 首先,我们需要在AndroidManifest文件中添加相应...

    精典源码之 实现自动接听和挂断电话功能.rar

    在Android平台上,实现自动接听和挂断电话的功能是一项常见的需求,尤其在开发电话相关的应用程序时。这个"精典源码之 实现自动接听和挂断电话功能.rar"压缩包很可能包含了一个示例项目,用于演示如何通过编程来完成...

    android来电挂断demo

    【Android来电挂断demo】是一个基于Android平台的项目示例,它主要展示了如何实现来电时自动识别并处理未存储在联系人中的电话号码。通过这个Demo,开发者可以学习到如何集成来电拦截功能,并在主屏幕上展示相关信息...

    Android应用源码之 实现自动接听和挂断电话功能(shop71713971.taobao.com).rar

    在Android平台上,开发一款能够自动接听和挂断电话的应用是一个涉及到系统权限和电话管理API的复杂任务。这个源码提供了一个实例,展示了如何在Android应用中实现这一功能。以下是相关的关键知识点: 1. **电话监听...

    自动接听或挂掉电话

    在Android平台上,自动接听或挂断电话是一种常见需求,尤其对于开发者来说,这涉及到系统级的权限和接口调用。本项目"PhoneCallDemo"提供了一个完整的解决方案,它能够自动处理来电,包括自动接听和挂断操作。让我们...

    电话自动接听、拒接工具

    应用启动后便可以在后台监听来电,并根据是否属于陌生电话和设置做出相应动作(自动接听还是直接拒绝),如果自动接听,将会产生一段振动以告知用户。 PS:因为老是有骚扰电话响一下就挂了,就想出这个阴招,叫它响...

    TelephoneAutoController:android 自动接听电话和挂断(支持所有版本)

    在Android应用开发中,有时我们需要实现自动接听电话和挂断电话的功能,特别是在车载导航、自动化测试或特殊场景应用中。本篇文章将详细探讨如何使用Java语言在Android平台上实现这一功能,并且确保在各个版本的...

    android实现接通和挂断电话

    通过PhoneUtils类可以实现电话的自动接听功能,例如在收到来电时自动接听电话。 4. 获取ITelephony接口 通过TelephonyManager可以获取ITelephony接口,例如通过反射机制可以获取到ITelephony接口的实例。获取...

    android手机静默接听

    这个功能允许用户在不触碰手机或无任何视觉提示的情况下,自动接听来电,通常用于特定场景,如驾驶、会议等。接下来,我们将详细探讨如何在Android平台上实现这一功能及其相关知识点。 一、权限申请 在Android中,...

    Android来电时停止音乐播放的流程学习

    ### Android来电时停止音乐播放的流程学习 #### 场景分析 在Android系统中,针对来电时音乐播放的控制机制可以分为以下两种典型场景: 1. **电话处于响铃模式时**: - 当有来电时,系统首先会自动暂停正在后台...

    android2.3 电话接听解决方法

    `PhoneUtils.java`这个文件可能是包含上述逻辑的一个工具类,或者包含了额外的功能,如处理来电显示、自动应答、挂断电话等。在实际开发中,你可能需要处理来电时启动Activity、播放提示音、显示自定义界面等功能。 ...

    自动接听电话和挂断案例

    自动接听电话和挂断案例源码,参考:android 来电接听和挂断 支持目前所有版本。注意:android2.3版本及以上不支持下面的自动接听方法。(会抛异常:java.lang.SecurityException: Neither user xxxxx nor current ...

Global site tag (gtag.js) - Google Analytics