
我正在写一个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中的通话?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)