android实现 5.0 6.0手机自动接听电话功能
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手机自动接听电话功能相关推荐
- android 5.0 自动接听电话
android 5.0 自动接听电话 new Thread(new Runnable() {@Overridepublic void run() {try {Runtime.getRuntime(). ...
- Android 自动接听电话和挂断
注意:android2.3版本及以上不支持下面的自动接听方法.(会抛异常:java.lang.SecurityException: Neither user xxxxx nor current pro ...
- Android 电话的反射调用机制实现自动接听电话
最近在看一些有关反射和aidl远程服务控制的类,自己也小写了这么一个Android 电话的反射调用机制实现静默接听电话demo 自己总结出来,以供查阅,若是还有其他问题,希望大家指出. 首先要调用系统 ...
- python实现自动拨打电话_python 实现手机自动拨打电话的方法(通话压力测试)
现在能用自动化实现的,尽量使用自动化程序去操作,代替人工去操作,更有效率. 今天说下用python结合adb命令去实现安卓手机端的通话压力测试. #操作前先在设置里打开power键可以结束通话按钮,否 ...
- python实现自动打电话-python 实现手机自动拨打电话的方法(通话压力测试)
现在能用自动化实现的,尽量使用自动化程序去操作,代替人工去操作,更有效率. 今天说下用python结合adb命令去实现安卓手机端的通话压力测试. #操作前先在设置里打开power键可以结束通话按钮,否 ...
- python 实现打电话_python 实现手机自动拨打电话的方法(通话压力测试)
现在能用自动化实现的,尽量使用自动化程序去操作,代替人工去操作,更有效率. 今天说下用python结合adb命令去实现安卓手机端的通话压力测试. #操作前先在设置里打开power键可以结束通话按钮,否 ...
- Android入门篇(四):自动拨打电话、手动拨打电话
Android入门篇(四):自动拨打电话.手动拨打电话 一.前言 最近在做的项目需要用到自动拨号的这一功能,17年写了一个,最近拿出来用发现不能使用了,后面查资料据说是因为Android 6(api2 ...
- Android中自动接听电话的功能
最近,需要完成一个自动化测试工具,来测试一些模块的功能,其中有些功能需要接通电话后才可以使用,因为这个工具是完全自动化的,所以需要处理自动接听电话 在4.1以前Android是提供了接口可以直接调用接 ...
- linphone 自动接听电话
自动接听电话 strings.xml: <string name="pref_auto_answer">Auto answer incoming calls</s ...
- 高版本自动接听电话方法
原文地址:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=894679&page=1&_dsign=b92c470 ...
最新文章
- 你不能忽视的HTML语言3
- Vue.js示例:GitHub提交(watch数据,created钩子,filters过滤); 网格组件(功能:1.检索,2排序);...
- 【转】iOS-Core-Animation-Advanced-Techniques(六)
- Winform中设置ZedGraph在生成多条曲线时随机采用不同的颜色
- android 列表倒计时,Android利用RecyclerView实现列表倒计时效果
- H.264 视频的 RTP 载荷格式
- mysql5.7.14安装版_MySql5.7.14安装教程详解(解压版)_MySQL
- 【PostgreSQL-9.6.3】约束
- 使用ERStudio创建数据表与ER图
- OC中数据库操作(类方法)
- golang 判断map的键key是否存在
- 我的世界java启动失败_我的世界游戏启动失败怎么办 PC版游戏崩溃解决办法
- [CTF] 攻防世界MISC高手区部分题目WriteUp
- repaire mysql_mysql检查数据表和修复数据表
- java求一元二次方程:ax2+bx+c=0的根
- html获取地理位置
- Windows驱动的加载顺序
- NTL密码算法开源库——大整数ZZ类(四)
- 磁盘阵列怎么组linux系统,Linux系统下如何设置磁盘阵列?
- 射击选手得分的排序问题