android 5.0 6.0系统实现app自动接听电话功能

1.前言:
最近公司有个需求,需要在app某个指定页面实现自动接听电话功能。当时我在想啊,这应该是一个黑科技功能吧,于是我网上找了好长时间,发现网上那些方法4.4以上系统不支持啊,当时我也是一脸懵逼啊,不过没事,我还是找到了解决办法,但是….(别急慢慢往下看哈)……,咱们先来看下4.4以下系统是如何实现自动接听功能的。

第一步:准备应用环境需要的系统包和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 )中;

第二步:新建一个广播PhoneReceiver类

package com.newshangman.org.Receiver;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.SystemClock;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.KeyEvent;import com.android.internal.telephony.ITelephony;
import com.newshangman.org.xutils.PhoneUtils;import java.io.IOException;
import java.lang.reflect.Method;import static android.R.attr.version;
import static android.content.Context.TELEPHONY_SERVICE;public class PhoneReceiver extends BroadcastReceiver {private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);try {if (count == 0) {// PhoneUtils.autoAnswerPhone(mContext, mIntent);autoAnswerPhone(mContext, mIntent);
//                    autoAnswerPhone1(mContext, mIntent);
//                    autoAnswerPhone2(mContext, mIntent);
//                    autoAnswerPhone3(mContext, mIntent);
//                    autoAnswerPhone4(mContext, mIntent);
//                    autoAnswerPhone5(mContext, mIntent);count++;}} catch (Exception e1) {e1.printStackTrace();}}};private Context mContext = null;private TelephonyManager mIntent = null;private int count = 0;@Overridepublic void onReceive(Context context, Intent intent) {mContext = context;TelephonyManager tm = (TelephonyManager) context.getSystemService(TELEPHONY_SERVICE);mIntent = tm;switch (tm.getCallState()) {case TelephonyManager.CALL_STATE_OFFHOOK:break;case TelephonyManager.CALL_STATE_RINGING:Message message = handler.obtainMessage();message.obj = "33";handler.sendMessage(message);break;case TelephonyManager.CALL_STATE_IDLE:break;}}public void setStopCALLPhone() {PhoneUtils.endPhone(mContext, mIntent);}// 自动接听4.1以下private static final void autoAnswerPhone(Context c, TelephonyManager tm) {try {java.lang.reflect.Method declaredMethod = tm.getClass().getDeclaredMethod("getITelephony");declaredMethod.setAccessible(true);ITelephony itelephony = (ITelephony) declaredMethod.invoke(tm);if (itelephony != null) {itelephony.answerRingingCall();}} catch (Exception e) {try {Intent intent = new Intent("android.intent.action.MEDIA_BUTTON");KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_HEADSETHOOK);intent.putExtra("android.intent.extra.KEY_EVENT", keyEvent);c.sendOrderedBroadcast(intent,"android.permission.CALL_PRIVILEGED");intent = new Intent("android.intent.action.MEDIA_BUTTON");keyEvent = new KeyEvent(KeyEvent.ACTION_UP,KeyEvent.KEYCODE_HEADSETHOOK);intent.putExtra("android.intent.extra.KEY_EVENT", keyEvent);c.sendOrderedBroadcast(intent,"android.permission.CALL_PRIVILEGED");e.printStackTrace();} catch (Exception e3) {try {Intent localIntent4 = new Intent(Intent.ACTION_HEADSET_PLUG);localIntent4.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);localIntent4.putExtra("state", 0);localIntent4.putExtra("microphone", 1);localIntent4.putExtra("name", "Headset");c.sendOrderedBroadcast(localIntent4,"android.permission.CALL_PRIVILEGED");e3.printStackTrace();} catch (Exception e4) {try {Intent localIntent3 = new Intent(Intent.ACTION_MEDIA_BUTTON);KeyEvent localKeyEvent2 = new KeyEvent(KeyEvent.ACTION_UP,KeyEvent.KEYCODE_HEADSETHOOK);localIntent3.putExtra("android.intent.extra.KEY_EVENT",localKeyEvent2);c.sendOrderedBroadcast(localIntent3,"android.permission.CALL_PRIVILEGED");e4.printStackTrace();} catch (Exception e5) {try {Intent localIntent1 = new Intent(Intent.ACTION_HEADSET_PLUG);localIntent1.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);localIntent1.putExtra("state", 1);localIntent1.putExtra("microphone", 1);localIntent1.putExtra("name", "Headset");c.sendOrderedBroadcast(localIntent1,"android.permission.CALL_PRIVILEGED");e5.printStackTrace();} catch (Exception e6) {try {Intent localIntent2 = new Intent(Intent.ACTION_MEDIA_BUTTON);KeyEvent localKeyEvent1 = new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_HEADSETHOOK);localIntent2.putExtra("android.intent.extra.KEY_EVENT",localKeyEvent1);c.sendOrderedBroadcast(localIntent2,"android.permission.CALL_PRIVILEGED");e6.printStackTrace();} catch (Exception e7) {try {Intent meidaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_UP,KeyEvent.KEYCODE_HEADSETHOOK);meidaButtonIntent.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent);c.sendOrderedBroadcast(meidaButtonIntent,null);e7.printStackTrace();} catch (Exception e2) {e2.printStackTrace();}}}}}}}}// // 自动接听// private static final void autoAnswerPhone(Context c, TelephonyManager tm)// {// try {// java.lang.reflect.Method declaredMethod = tm.getClass()// .getDeclaredMethod("getITelephony");// declaredMethod.setAccessible(true);// ITelephony itelephony = (ITelephony) declaredMethod.invoke(tm);// if (itelephony != null) {// itelephony.answerRingingCall();// }// } catch (Exception e) {// try {// Intent intent = new Intent("android.intent.action.MEDIA_BUTTON");// KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_DOWN,// KeyEvent.KEYCODE_HEADSETHOOK);// intent.putExtra("android.intent.extra.KEY_EVENT", keyEvent);// c.sendOrderedBroadcast(intent,// "android.permission.CALL_PRIVILEGED");// intent = new Intent("android.intent.action.MEDIA_BUTTON");// keyEvent = new KeyEvent(KeyEvent.ACTION_UP,// KeyEvent.KEYCODE_HEADSETHOOK);// intent.putExtra("android.intent.extra.KEY_EVENT", keyEvent);// c.sendOrderedBroadcast(intent,// "android.permission.CALL_PRIVILEGED");// } catch (Exception e2) {// }// }// }// 自动接听private static final void autoAnswerPhone1(Context c, TelephonyManager tm) {try {java.lang.reflect.Method declaredMethod = tm.getClass().getDeclaredMethod("getITelephony");declaredMethod.setAccessible(true);ITelephony itelephony = (ITelephony) declaredMethod.invoke(tm);if (itelephony != null) {itelephony.answerRingingCall();}} catch (Exception e) {try {Intent localIntent4 = new Intent(Intent.ACTION_HEADSET_PLUG);localIntent4.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);localIntent4.putExtra("state", 0);localIntent4.putExtra("microphone", 1);localIntent4.putExtra("name", "Headset");c.sendOrderedBroadcast(localIntent4,"android.permission.CALL_PRIVILEGED");} catch (Exception e2) {}}}/*** 自动接听电话*/
//  private void autoAnswercall(){//      Intent meidaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
//      KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK);
//      meidaButtonIntent.putExtra(Intent.EXTRA_KEY_EVENT,keyEvent);
//      TApplication.nowApplication.sendOrderedBroadcast(meidaButtonIntent, null);
//  }// 自动接听private static final void autoAnswerPhone2(Context c, TelephonyManager tm) {try {java.lang.reflect.Method declaredMethod = tm.getClass().getDeclaredMethod("getITelephony");declaredMethod.setAccessible(true);ITelephony itelephony = (ITelephony) declaredMethod.invoke(tm);if (itelephony != null) {itelephony.answerRingingCall();}} catch (Exception e) {try {Intent localIntent3 = new Intent(Intent.ACTION_MEDIA_BUTTON);KeyEvent localKeyEvent2 = new KeyEvent(KeyEvent.ACTION_UP,KeyEvent.KEYCODE_HEADSETHOOK);localIntent3.putExtra("android.intent.extra.KEY_EVENT",localKeyEvent2);c.sendOrderedBroadcast(localIntent3,"android.permission.CALL_PRIVILEGED");} catch (Exception e2) {}}}//    //高版本自动接听电话
//    private static final void autoAnswerPhonenew(Context c, TelephonyManager tm) {//
//        try {//            Method method = Class.forName("android.os.ServiceManager").getMethod("getService",
//                    String.class);
//
//            IBinder binder = (IBinder) method.invoke(null, new Object[]{TELEPHONY_SERVICE});
//
//            ITelephony telephony = ITelephony.Stub.asInterface(binder);
//
//            telephony.answerRingingCall();
//
//        } catch (NoSuchMethodException e)
//
//        {//            Log.d("Sandy", "", e);
//
//        } catch (
//                ClassNotFoundException e) {//            Log.d("Sandy", "", e);
//
//        } catch (
//                Exception e)
//        {//            Log.d("Sandy", "", e);
//            try {//
//                Log.e("Sandy", "for version 4.1 or larger ");
//
//                Intent intent = new Intent("android.intent.action.MEDIA_BUTTON");
//
//                KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK);
//
//                intent.putExtra("android.intent.extra.KEY_EVENT", keyEvent);
//
//                sendOrderedBroadcast(intent, "android.permission.CALL_PRIVILEGED");
//
//            } catch (Exception e2) {//
//                Log.d("Sandy", "", e2);
//
//                Intent meidaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
//
//                KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK);
//
//                meidaButtonIntent.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent);
//                sendOrderedBroadcast(meidaButtonIntent, null);
//            }
//        }
//    }
//// 自动接听private static final void autoAnswerPhone3(Context c, TelephonyManager tm) {try {java.lang.reflect.Method declaredMethod = tm.getClass().getDeclaredMethod("getITelephony");declaredMethod.setAccessible(true);ITelephony itelephony = (ITelephony) declaredMethod.invoke(tm);if (itelephony != null) {itelephony.answerRingingCall();}} catch (Exception e) {try {Intent localIntent1 = new Intent(Intent.ACTION_HEADSET_PLUG);localIntent1.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);localIntent1.putExtra("state", 1);localIntent1.putExtra("microphone", 1);localIntent1.putExtra("name", "Headset");c.sendOrderedBroadcast(localIntent1,"android.permission.CALL_PRIVILEGED");} catch (Exception e2) {}}}// 自动接听private static final void autoAnswerPhone4(Context c, TelephonyManager tm) {try {java.lang.reflect.Method declaredMethod = tm.getClass().getDeclaredMethod("getITelephony");declaredMethod.setAccessible(true);ITelephony itelephony = (ITelephony) declaredMethod.invoke(tm);if (itelephony != null) {itelephony.answerRingingCall();}} catch (Exception e) {try {Intent localIntent2 = new Intent(Intent.ACTION_MEDIA_BUTTON);KeyEvent localKeyEvent1 = new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_HEADSETHOOK);localIntent2.putExtra("android.intent.extra.KEY_EVENT",localKeyEvent1);c.sendOrderedBroadcast(localIntent2,"android.permission.CALL_PRIVILEGED");} catch (Exception e2) {}}}// 自动接听private static final void autoAnswerPhone5(Context c, TelephonyManager tm) {try {java.lang.reflect.Method declaredMethod = tm.getClass().getDeclaredMethod("getITelephony");declaredMethod.setAccessible(true);ITelephony itelephony = (ITelephony) declaredMethod.invoke(tm);if (itelephony != null) {itelephony.answerRingingCall();}} catch (Exception e) {try {Intent meidaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_UP,KeyEvent.KEYCODE_HEADSETHOOK);meidaButtonIntent.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent);c.sendOrderedBroadcast(meidaButtonIntent, null);} catch (Exception e2) {}}}}

第三步:咱们看下调用的地方
其实调用很简单:随便新建一个类:比如DialBackActivity.java类(我自己项目定义的,你们可以随意的定义)

上面就是调用的地方,是不是很简单。

最后一步: 配置应用程序权限(这步别忘记了哦)

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

注意:以上代码仅限4.4以下手机系统调用 ,但在5.0系统以上调用以上方法会报一个异常:

其实网上好多博客上说,对高版本手机处理的方法。(但我都试过了,没用的。)因为啊。去年10,11月份左右。好多手机修复了这个漏洞,所以这些方法在高版本的手机上几乎是不支持的。之前做这个功能,也是利用了广播漏洞去是实现的(废话不多说咱们看下5.0 6.0系统如何实现自动接听的尼)。

第一步:在之前的那个Mainactivity(自己新建一个类),写一个监听方法:(如下)

    /** 监听* */class MyPhoneStateListener extends PhoneStateListener {@Overridepublic void onCallStateChanged(int state, String incomingNumber) {switch (state) {//响铃:case TelephonyManager.CALL_STATE_RINGING://自动接听autoPhone();//5.0手机自动接听break;//挂断电话case TelephonyManager.CALL_STATE_IDLE:break;//接听电话case TelephonyManager.CALL_STATE_OFFHOOK:break;}super.onCallStateChanged(state, incomingNumber);}}
    /** 5.0以上接听方法  **主要手这个方法(**部分不支持不行)* */private void autoPhone() {try {if (android.os.Build.VERSION.SDK_INT >= 19) {AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);long eventtime = SystemClock.uptimeMillis() - 1;KeyEvent var6 = new KeyEvent(/*eventtime, 1L + eventtime, */0, 79/*, 0, 0, 0, 0, 128*/);KeyEvent var7 = new KeyEvent(1, 79);am.dispatchMediaKeyEvent(var6);am.dispatchMediaKeyEvent(var7);} else {Runtime.getRuntime().exec("input keyevent " + Integer.toString(KeyEvent.KEYCODE_HEADSETHOOK));}} catch (IOException e) {}}
  /***/private void getCallphone() {try {//String phoneNamea = android.os.Build.MODEL;//手机型号TelephonyManager telephony = (TelephonyManager) getApplication().getSystemService(Context.TELEPHONY_SERVICE);telephony.listen(new MyPhoneStateListener(),  PhoneStateListener.LISTEN_CALL_STATE);Class<?> c = Class.forName(telephony.getClass().getName());Method m = c.getDeclaredMethod("getITelephony");m.setAccessible(true);} catch (Exception e) {e.printStackTrace();}}

最后一步:只需要在初始化地方调用getCallphone()这个方法就行.是不是发现好简单啊.

这里我给你们解释下autoPhone()这个方法的作用,其实就是模拟了耳机按钮按下接听电话的,其实我感觉用.利用AccessibilityService辅助服务也可以实现这个功能,但没亲自实现过….你们可以尝试下
但是啊,虽然5.0 6.0系统上可以支持自动接听功能,但是还是有些手机不支持,(暂时无解,据说7.0以上系统都GG了)。

总结:自动接听电话功能,只支持部分手机,要是有小伙伴,有更好的方法可以随时留言或者加QQ2585760090联系,谢谢

android实现 5.0 6.0手机自动接听电话功能相关推荐

  1. android 5.0 自动接听电话

    android 5.0 自动接听电话 new Thread(new Runnable() {@Overridepublic void run() {try {Runtime.getRuntime(). ...

  2. Android 自动接听电话和挂断

    注意:android2.3版本及以上不支持下面的自动接听方法.(会抛异常:java.lang.SecurityException: Neither user xxxxx nor current pro ...

  3. Android 电话的反射调用机制实现自动接听电话

    最近在看一些有关反射和aidl远程服务控制的类,自己也小写了这么一个Android 电话的反射调用机制实现静默接听电话demo 自己总结出来,以供查阅,若是还有其他问题,希望大家指出. 首先要调用系统 ...

  4. python实现自动拨打电话_python 实现手机自动拨打电话的方法(通话压力测试)

    现在能用自动化实现的,尽量使用自动化程序去操作,代替人工去操作,更有效率. 今天说下用python结合adb命令去实现安卓手机端的通话压力测试. #操作前先在设置里打开power键可以结束通话按钮,否 ...

  5. python实现自动打电话-python 实现手机自动拨打电话的方法(通话压力测试)

    现在能用自动化实现的,尽量使用自动化程序去操作,代替人工去操作,更有效率. 今天说下用python结合adb命令去实现安卓手机端的通话压力测试. #操作前先在设置里打开power键可以结束通话按钮,否 ...

  6. python 实现打电话_python 实现手机自动拨打电话的方法(通话压力测试)

    现在能用自动化实现的,尽量使用自动化程序去操作,代替人工去操作,更有效率. 今天说下用python结合adb命令去实现安卓手机端的通话压力测试. #操作前先在设置里打开power键可以结束通话按钮,否 ...

  7. Android入门篇(四):自动拨打电话、手动拨打电话

    Android入门篇(四):自动拨打电话.手动拨打电话 一.前言 最近在做的项目需要用到自动拨号的这一功能,17年写了一个,最近拿出来用发现不能使用了,后面查资料据说是因为Android 6(api2 ...

  8. Android中自动接听电话的功能

    最近,需要完成一个自动化测试工具,来测试一些模块的功能,其中有些功能需要接通电话后才可以使用,因为这个工具是完全自动化的,所以需要处理自动接听电话 在4.1以前Android是提供了接口可以直接调用接 ...

  9. linphone 自动接听电话

    自动接听电话 strings.xml: <string name="pref_auto_answer">Auto answer incoming calls</s ...

  10. 高版本自动接听电话方法

    原文地址:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=894679&page=1&_dsign=b92c470 ...

最新文章

  1. 你不能忽视的HTML语言3
  2. Vue.js示例:GitHub提交(watch数据,created钩子,filters过滤); 网格组件(功能:1.检索,2排序);...
  3. 【转】iOS-Core-Animation-Advanced-Techniques(六)
  4. Winform中设置ZedGraph在生成多条曲线时随机采用不同的颜色
  5. android 列表倒计时,Android利用RecyclerView实现列表倒计时效果
  6. H.264 视频的 RTP 载荷格式
  7. mysql5.7.14安装版_MySql5.7.14安装教程详解(解压版)_MySQL
  8. 【PostgreSQL-9.6.3】约束
  9. 使用ERStudio创建数据表与ER图
  10. OC中数据库操作(类方法)
  11. golang 判断map的键key是否存在
  12. 我的世界java启动失败_我的世界游戏启动失败怎么办 PC版游戏崩溃解决办法
  13. [CTF] 攻防世界MISC高手区部分题目WriteUp
  14. repaire mysql_mysql检查数据表和修复数据表
  15. java求一元二次方程:ax2+bx+c=0的根
  16. html获取地理位置
  17. Windows驱动的加载顺序
  18. NTL密码算法开源库——大整数ZZ类(四)
  19. 磁盘阵列怎么组linux系统,Linux系统下如何设置磁盘阵列?
  20. 射击选手得分的排序问题

热门文章

  1. 世界上最恐怖的格斗比赛---黑市拳赛
  2. matlab fread函数详解
  3. #读书笔记#《挪威森林》 | 当孤独,如影随形
  4. 计算机软考网络工程师,软考之网络工程师总结
  5. Python基础语法(if语句)
  6. UI设计和平面设计有什么区别哪个前景更好
  7. 计算机毕业设计springboot家政管理系统
  8. 华硕怎么安装linux系统教程,华硕笔记本系统如何安装win10和linux 双系统
  9. 完全免费的公众号文章批量下载器
  10. mysql驱动包放在ecplise哪里_eclipse导入mysql jdbc驱动包的具体步骤及注意事项