【问题标题】:No such method getITelephony to disconnect Call没有这样的方法 getITelephony 断开呼叫
【发布时间】:2013-04-11 10:03:50
【问题描述】:

我想在 ICS 中断开拨出电话。

我的问题首先是我没有在 Gingerbread 的 IC 中获得广播,它工作正常并阻止呼叫,但在 ICS 中它不是广播。

对于 BroadCast,我创建了一个服务,并且我在 ICS 中也获得了 PHONE_STATE 的广播,但是当我尝试断开呼叫时,我收到了错误

NO such method name 'getITelephony'

在 ICS 通话中没有断开。

我正在使用以下代码通过广播断开呼叫...

try{
       TelephonyManager manager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
       Class c = Class.forName(manager.getClass().getName());
       Method m = c.getDeclaredMethod("getITelephony");
       m.setAccessible(true);
       ITelephony telephony = (ITelephony)m.invoke(manager);
       telephony.endCall();
  } catch(Exception e){
       Log.d("",e.getMessage());
  }

AndroidMaifest.xml

PhonecallStateBroadcastReceiver.java

包名称为package com.android.internal.telephony;

ITelephony.aidl

interface ITelephony 
{
    boolean endCall();
    void answerRingingCall();
    void silenceRinger();
}

【问题讨论】:

  • 我在 google nexus 中遇到了同样的问题

标签: android broadcastreceiver android-4.0-ice-cream-sandwich


【解决方案1】:

1) 下载这个课程:ITelephony

2) 在你的项目中添加这个class.java包:com.android.internal.telephony

3) 在清单中添加此权限:

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE" />

应用应答器中的这个接收器:

<receiver android:name=".CallReceiver" >
   <intent-filter>
     <action android:name="android.intent.action.PHONE_STATE" />
   </intent-filter>
</receiver>

4) 创建 CallReceiver 类:

@Override
public void onReceive(Context context, Intent intent) {
    ITelephony telephonyService = getTeleService(context);
    if(telephonyService!=null) {
        try {
            String numberCall = intent.getExtras().getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
            Log.i("TAG", "CALL NUM: " + numberCall);
            if(numberCall.equals(TEST_NUMBER)) {
                telephonyService.endCall();
                Toast.makeText(context, "END CALL: " + numberCall, Toast.LENGTH_LONG).show();
                Log.i("TAG", "END CALL");
            } else {
                Log.i("TAG", "ACCEPT CALL");
            }
        } catch (Exception e) {
            e.printStackTrace();
            Log.i("TAG", "CATCH CALL");
        }
    }
}

private ITelephony getTeleService(Context context) {
    TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    try {
        Method m = Class.forName(tm.getClass().getName()).getDeclaredMethod("getITelephony");
        m.setAccessible(true);
        return (ITelephony) m.invoke(tm);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

【讨论】:

【解决方案2】:

在 Android 2.3+ 中无法使用反射来访问“getITelephony”

参考:

http://hive-mind.org/android-call-blocking

How do you programmatically end a call on 2.3+?

【讨论】:

  • 我知道它不起作用,这就是为什么我发布了这个问题,而我已经检查过的另一个链接也给了我同样的回应......
  • 那么您的问题应适当修改以请求替代解决方案
  • 但在那个答案中提到silenceRinger() is not working but endCall() is just fine
  • 是的。只是我提供了我所说的参考,而不是替代解决方案。
【解决方案3】:

类 c = Class.forName("android.telephony.TelephonyManager");这将解决您的 Android 2.3+ 问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多