2013-02-21 82 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