2011-09-08 64 views
5

在我的应用程序中,我将维护一个联系人列表。如何在android中以编程方式拒绝呼叫

来自列表中联系人的任何呼叫都将被删除。他们会在未接来电时显示,但手机不会响。

+0

ContentObserver是单词的时候你最能实践 –

+0

可能重复[如何在android中阻止调用](http://stackoverflow.com/questions/1083527/how-to-block-calls-in-android) –

+0

'MODIFY_PHONE_STATE' [权限仅限于系统应用](http:///stackoverflow.com/questions/4715250/how-to-grant-modify-phone-state-permission-for-apps-ran-on-gingerbread)(适用于android 2.3及以上版本)。如果你想只用于你有权访问的手机,你可以[制作你的应用系统应用](http://projectmaxs.org/documentation/systemapp.html) – tchelidze

回答

15

首先创建这个接口:

public interface ITelephony { 

     boolean endCall(); 

     void answerRingingCall(); 

     void silenceRinger(); 

    } 

然后建立这个类,它扩展了BroadcastReceiver

public class IncomingCallReceiver extends BroadcastReceiver { 
    private ITelephony telephonyService; 
    private String blacklistednumber = "+458664455"; 

    @Override 
    public void onReceive(Context context, Intent intent) { 

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

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

这只会阻止单个PHONENUMBER,但你明白了吧。

在您的清单补充一点:

<receiver android:name=".IncomingCallReceiver"> 
    <intent-filter android:priority="999"> 
     <action android:name="android.intent.action.PHONE_STATE" /> 
    </intent-filter> 
</receiver> 
<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

嗨,我做到了。但是发生了点击。如何创建接口我的意思是正常的接口或aidl文件 – harish

+0

只是创建一个正常的intercafe。但是你可能需要把它放在名为com.android.internal.telephony的包中。 –

+0

即使它不工作,我认为我们必须生成aidl文件。但不知道该怎么做。 – harish

2

here下载类ITelephony的。

然后把它放在一个包装(使一个新的封装)的com.android.internal.telephony. 然后包导入到合适的类和拒绝呼叫使用endCall()方法

相关问题