2013-02-21 73 views
12

我想在android中拒绝接收,我已经看到这么多链接的代码。拒绝来电android

  1. Android: Taking complete control of phone(kiosk mode), is it possible? How?

  2. How to Reject a call programatically in android

  3. http://androidsourcecode.blogspot.in/2010/10/blocking-incoming-call-android.html

  4. http://androidbridge.blogspot.com/2011/05/how-to-answer-incoming-call-in-android.html?showComment=1361478035090#c5468022990217431781

但我仍然无法做到这一点,可以anyb ody简单易行地告诉我如何做到这一点?

+0

我拦截呼出,但无法理解这些网页上提到的来电和他们拦截背后的逻辑。 – Zubair 2013-02-21 21:09:30

+0

可能重复[在Android编程的结束调用](http://stackoverflow.com/questions/18065144/end-call-in-android-programmatically) – Flow 2014-08-28 10:05:25

回答

1

您将需要一个广播接收器与意图过滤器,我认为ACTION_ANSWER

更多详细的在这里:http://developer.android.com/reference/android/content/Intent.html#ACTION_ANSWER

您可以使用清单文件或者方法进行注册registerReceiver

更多的信息在这里:http://developer.android.com/reference/android/content/Context.html#registerReceiver(android.content.BroadcastReceiver,android.content.IntentFilter)

你也需要在清单文件中指定适当的权限。

<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" /> 
<uses-permission android:name="android.permission.PROCESS_INCOMING_CALLS" /> 

您提供的链接非常好。你只需要更多的耐心:)

快乐的编码。

+0

大声笑。我一直在尝试4至5天..思想可能有些东西在这些链接中被遗漏.. – Zubair 2013-02-21 21:18:19

+1

另一个提示,如果你想打电话,只有在应用程序运行时才会被拒绝,最好在onResume循环中以编程方式注册接收器,并在onPause周期取消注册。因为我认为只要应用程序在您的系统中未被删除,即使应用程序未运行,它也会捕获或接收电话,如果您将它注册到清单上,它就会被注册。 – 2013-02-21 21:43:55

+0

嗯。这很好。但是如果我使用服务呢?我应该取消注册destroy()? – Zubair 2013-02-21 21:52:52

14

为了拦截您的电话,您只需:
1.制作一个名为的包。 com.android.internal.telephony;
2.在此包中创建一个名为ITelephony的接口文件。
并将该代码写入该接口文件。

boolean endCall(); 
void answerRingingCall(); 
void silenceRinger(); 

要拦截调用类扩展到BroadcastReceiveronReceive()函数编写如下代码现在,在你的类。

TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 
    try { 
    Class c = Class.forName(tm.getClass().getName()); 
    Method m = c.getDeclaredMethod("getITelephony"); 
    m.setAccessible(true); 
    telephonyService = (ITelephony) m.invoke(tm); 
    Bundle bundle = intent.getExtras(); 
    String phoneNumber = bundle.getString("incoming_number"); 
    Log.d("INCOMING", phoneNumber); 
    if ((phoneNumber != null)) { 
     telephonyService.endCall(); 
     Log.d("HANG UP", phoneNumber); 
    } 

    } catch (Exception e) { 
    e.printStackTrace(); 
    } 

那就是它。

+0

为我工作。真棒! – Ahmed 2013-03-18 06:27:20

+2

获取NoSuchMethodException在方法m = c.getDeclaredMethod(“getITelephony”); ..如何避免它? – astuter 2014-03-26 12:43:16

+0

@Zubair是否有任何需要这样做的权限? – 2014-06-30 16:43:40

3

提供适当的权限,并添加ITelephony.java文件

private void declinePhone(Context context) throws Exception { 

     try { 

      String serviceManagerName = "android.os.ServiceManager"; 
      String serviceManagerNativeName = "android.os.ServiceManagerNative"; 
      String telephonyName = "com.android.internal.telephony.ITelephony"; 
      Class<?> telephonyClass; 
      Class<?> telephonyStubClass; 
      Class<?> serviceManagerClass; 
      Class<?> serviceManagerNativeClass; 
      Method telephonyEndCall; 
      Object telephonyObject; 
      Object serviceManagerObject; 
      telephonyClass = Class.forName(telephonyName); 
      telephonyStubClass = telephonyClass.getClasses()[0]; 
      serviceManagerClass = Class.forName(serviceManagerName); 
      serviceManagerNativeClass = Class.forName(serviceManagerNativeName); 
      Method getService = // getDefaults[29]; 
      serviceManagerClass.getMethod("getService", String.class); 
      Method tempInterfaceMethod = serviceManagerNativeClass.getMethod("asInterface", IBinder.class); 
      Binder tmpBinder = new Binder(); 
      tmpBinder.attachInterface(null, "fake"); 
      serviceManagerObject = tempInterfaceMethod.invoke(null, tmpBinder); 
      IBinder retbinder = (IBinder) getService.invoke(serviceManagerObject, "phone"); 
      Method serviceMethod = telephonyStubClass.getMethod("asInterface", IBinder.class); 
      telephonyObject = serviceMethod.invoke(null, retbinder); 
      telephonyEndCall = telephonyClass.getMethod("endCall"); 
      telephonyEndCall.invoke(telephonyObject); 

     } catch (Exception e) { 
      e.printStackTrace(); 
      Log.d("unable", "msg cant dissconect call...."); 

     } 
+0

Ajay它不起作用:( – 2016-02-23 05:08:09

+0

伟大的解决方案..需要把一个添加到它...对于M +版本,我们还需要获得CALL_PHONE的运行时权限。干杯! – AndroidHacker 2016-10-04 07:09:26

+0

已经把完整的解决方案自问的问题.. http://stackoverflow.com/questions/39527748/programmatically-disconnect-call-in-android-marshmallow-version – AndroidHacker 2016-10-04 07:10:50

0

创建com.android.internal.telephony 和名称

interface ITelephony { 
    /** 
    * Demonstrates some basic types that you can use as parameters 
    * and return values in AIDL. 
    */ 
    void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, 
      double aDouble, String aString); 
    boolean endCall(); 
    void silenceRinger();strong text 
    void answerRingingCall(); 
} 

// then catch the incoming call intent and call below method 



    if (intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER) != null) { 
         number = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER); 
         Toast.makeText(context, "INCOMING call catched: ", Toast.LENGTH_SHORT).show(); 
disconnectPhoneItelephony(mContext) 
        } 


    private void disconnectPhoneItelephony(Context context) { 
      ITelephony telephonyService; 
      TelephonyManager telephony = (TelephonyManager) 
        context.getSystemService(Context.TELEPHONY_SERVICE); 
      try { 
       Class c = Class.forName(telephony.getClass().getName()); 
       Method m = c.getDeclaredMethod("getITelephony"); 
       m.setAccessible(true); 
       SessionManager.getInstance(context).setBlockStatusAllow("BLOCKED"); 
       telephonyService = (ITelephony) m.invoke(telephony); 
       telephonyService.silenceRinger(); 
       telephonyService.endCall(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 

的接口在清单

添加必要的许可
0

这是最好的教程阻止所有来电,您可以对其进行自定义以阻止只有选定号码的来电。

Android Incoming Call Block