自动实现接听来电功能的方法:
1.使用aidl:这种方法需要系统签名权限
首先在src目录下创建一个路径com.android.internal.telephony,然后在这个包下创建ITelephony.aidl文件,
package com.android.internal.telephony;
interface ITelephony {
boolean endCall();
void answerRingingCall();
}
重新编译项目会在gen目录下生成一个com.android.internal.telephony路径,路径下有一个ITelephony.java文件。
监听手机状态
TelephonyManager mTelephonyManager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
mTelephonyManager.listen(phoneStateListener,PhoneStateListener.LISTEN_CALL_STATE);
PhoneStateListener phoneStateListener = new PhoneStateListener() {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:
answerCall( );
break;
}
}
}
在state为1时,为响铃状态,此时调用自动接听的方法.
通过反射得到一个ITelephony对象,然后调用answerRingingCall()方法
public synchronized void answerCall() {
TelephonyManager mTelephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
Method getITelephonyMethod = mTelephonyManager .getClass() .getDeclaredMethod("getITelephony");
getITelephonyMethod.setAccessible(true);
ITelephony iTelephony = (ITelephony) getITelephonyMethod.invoke(mTelephonyManager );
iTelephony.answerRingingCall( );
}
2.通过发送广播,这里是模拟手机插上耳机时按下接听按钮,系统发送的广播。//按下和松开
Intent mintent = new Intent(Intent.ACTION_MEDIA_BUTTON);
KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_HEADSETHOOK);
mintent.putExtra("android.intent.extra.KEY_EVENT", keyEvent);
sendOrderedBroadcast(mintent,"android.permission.CALL_PRIVILEGED");
mintent = new Intent(Intent.ACTION_MEDIA_BUTTON);
keyEvent = new KeyEvent(KeyEvent.ACTION_UP,KeyEvent.KEYCODE_HEADSETHOOK);
mintent.putExtra("android.intent.extra.KEY_EVENT", keyEvent);
sendOrderedBroadcast(mintent,"android.permission.CALL_PRIVILEGED");
3.这和第二种方法类似,而且需要的权限更少,这种方法就是通过音频管理器,模拟点击耳机上的接听按键。
AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
KeyEvent var6 = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_HEADSETHOOK);
KeyEvent var7 = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK);
am.dispatchMediaKeyEvent(var6);
am.dispatchMediaKeyEvent(var7);