我正在编写一个 android 应用程序,我需要在其中接听来电,做一些工作,然后结束通话。在谷歌搜索之后,我可以找到两种不同的方法来实现这一点,这两种方法都不适用于最新版本的 Android,特别是在 4.1 之后的 Jelly Bean。
I.) 在“android.intent.action.PHONE_STATE”的广播接收器中使用 Java 反射访问“com.android.internal.telephony.ITelephony”。下面的示例代码可以在数百篇相关帖子中找到:
public class PhoneCallReceiver extends BroadcastReceiver {
Context context = null;
private static final String TAG = "Phone call";
private ITelephony telephonyService;
@Override
public void onReceive(Context context, Intent intent) {
if (!intent.getAction().equals("android.intent.action.PHONE_STATE"))
return;
Log.v(TAG, "Receving....");
TelephonyManager telephony = (TelephonyManager)
context.getSystemService(Context.TELEPHONY_SERVICE);
try {
Log.v(TAG, "Get getTeleService...");
Class c = Class.forName(telephony.getClass().getName());
Method m = c.getDeclaredMethod("getITelephony");
m.setAccessible(true);
telephonyService = (ITelephony) m.invoke(telephony);
telephonyService.silenceRinger();
Log.v(TAG, "Answering Call now...");
telephonyService.answerRingingCall();
Log.v(TAG, "Call answered...");
//telephonyService.endCall();
} catch (Exception e) {
e.printStackTrace();
Log.e(TAG,
"FATAL ERROR: could not connect to telephony subsystem");
Log.e(TAG, "Exception object: " + e);
}
}
}
这段代码的问题是
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
需要此方法才能工作,并且此权限已从 android v 2.3 定义为“仅适用于系统应用程序”。简而言之,普通用户应用程序无法再在清单文件中定义此权限。
II.) 另一种方法是模拟推送耳机挂钩,使 Android 接听电话。这是通过广播“Intent.ACTION_MEDIA_BUTTON”来完成的,如下面的代码所示。
public class PhoneCallReceiver extends BroadcastReceiver {
Context context = null;
private static final String TAG = "Phone call";
@Override
public void onReceive(Context context, Intent intent) {
if (!intent.getAction().equals("android.intent.action.PHONE_STATE"))
return;
String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
String number = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
Intent answer = new Intent(Intent.ACTION_MEDIA_BUTTON);
answer.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK));
context.sendOrderedBroadcast(answer, null);
Log.d(TAG, "Answered incoming call from: " + number);
}
return;
}
}
此方法一直有效到 Android 4.1,之后 android 已限制用户应用程序广播“Intent.ACTION_MEDIA_BUTTON”。
所以我的结论是,目前我们无法在 Android 4.1 或更高版本中实现这一点。
有没有其他人找到任何其他解决方案或解决这个问题的方法?