如何以编程方式回答结束Android 4.1中的通话?

如何以编程方式回答结束Android 4.1中的通话?,第1张

概述我正在写一个Android应用程序,我需要接听来电,做一些工作,然后结束通话.在所有谷歌搜索之后,我可以找到两种不同的方法来实现这一点,这两种方法都不适用于Android的最新版本,特别是在4.1,JellyBean之后.I.)使用广播接收器中的JavaReflection为“android.intent.action.PHONE_ST

我正在写一个Android应用程序,我需要接听来电,做一些工作,然后结束通话.
在所有谷歌搜索之后,我可以找到两种不同的方法来实现这一点,这两种方法都不适用于AndroID的最新版本,特别是在4.1,Jelly Bean之后.

I.)使用广播接收器中的Java Reflection为“androID.intent.action.PHONE_STATE”访问“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.)另一种方法是模拟推动headset钩子,这使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或更高版本中实现这一目标.

有没有其他人找到这个问题的任何其他解决方案或解决方法?

解决方法:

这适用于从AndroID 2.2到4.0,现在将try catch添加到最后一行后,它适用于4.1.2和4.2坦率地说,不知道它是如何工作的,但它适用于我.

Log.d(tag, "InSecond Method Ans Call");// froyo and beyond trigger on buttonUp instead of buttonDownIntent buttonUp = new Intent(Intent.ACTION_MEDIA_button);buttonUp.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_headSETHOOK));sendOrderedbroadcast(buttonUp, "androID.permission.CALL_PRIVILEGED");Intent headSetUnPluggedintent = new Intent(Intent.ACTION_headSET_PLUG);headSetUnPluggedintent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);headSetUnPluggedintent.putExtra("state", 0);headSetUnPluggedintent.putExtra("name", "headset");try {    sendOrderedbroadcast(headSetUnPluggedintent, null);} catch (Exception e) {     e.printstacktrace();}

这对我在AndroID 4.1.2中工作以及我在4.2上测试过
这仍然是一个处理的异常.

编辑结束通话

希望这有助于所有寻找答案和结束通话的整体解决方案的人.

/** * Reject button click Listener will reject the incoming call. */private class RejectCallOnClickListener implements OnClickListener {    @OverrIDe    public voID onClick(VIEw v) {        Log.d(tag, "OnRejectbutton: " + "Reject OnClick");        ignoreCall();        exitCleanly();    }}/** * ignore incoming calls */private voID ignoreCall() {    if (USE_ITELEPHONY)        ignoreCallAIDl();    else        ignoreCallPackageRestart();}/** * AIDL/ITelephony technique for ignoring calls */private voID ignoreCallAIDl() {    try {        // telephonyService.silenceRinger();        telephonyService.endCall();    } catch (remoteexception e) {        e.printstacktrace();        Log.d(tag, "ignoreCall: " + "Error: " + e.getMessage());    } catch (Exception e) {        e.printstacktrace();        Log.d(tag, "ignoreCall" + "Error: " + e.getMessage());    }}/** * package restart technique for ignoring calls */private voID ignoreCallPackageRestart() {    ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);    am.restartPackage("com.androID.provIDers.telephony");    am.restartPackage("com.androID.phone");}/** * cleanup and exit routine */private voID exitCleanly() {    unHookReceiver();    this.finish();}
总结

以上是内存溢出为你收集整理的如何以编程方式回答/结束Android 4.1中的通话?全部内容,希望文章能够帮你解决如何以编程方式回答/结束Android 4.1中的通话?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1104231.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-28
下一篇2022-05-28

发表评论

登录后才能评论

评论列表(0条)

    保存