2011-08-06 65 views
0

我想创建一个应用程序,我可以在一个块或允许列表中设置不同的电话号码。是否可以阻止或只允许某些电话号码,如果有的话,我将如何去做这件事。先谢了,乔纳森。阻止传入和传出的电话?

+0

contentObserver将帮助您 –

+0

收到呼叫的广播,并使用电话ISDL结束通话。 telephony isdl包含结束呼叫方法,可帮助您结束呼叫。对于特定号码,您必须使用电话管理员检查号码 –

回答

0

听起来像你必须创建一个与注册的PhoneStateListener服务,它使您可以收听有关更改手机状态的事件。所以如果有人打电话给你,你可以在你的听众那里捕捉到这个事件并作出相应的反应你自己PhoneStateListener看起来是这样的:

public class CustomPhoneStateListener extends PhoneStateListener { 

public void onCallStateChanged(int state, String incomingNumber) { 

    switch (state) { 
    case TelephonyManager.CALL_STATE_IDLE:    
     doSomething(); 
     break; 
    case TelephonyManager.CALL_STATE_OFFHOOK: 
     doSomething(); 
     break; 
    case TelephonyManager.CALL_STATE_RINGING: 
     if(incomingNumber.equels(blockedNumber)) { 
      blockNumber(); 
     } 
     break; 
    } 
} 

}

在手机状态等于CALL_STATE_RINGING你可以把你的逻辑,如果来电号码在等于要阻止的号码来电的情况下你的“阻塞的号码清单”。为了得到它所有的工作,你必须在你的服务中注册这个监听器(在onCreate方法中,不要忘记在onDestroy中注销它),并且为你的android清单添加一个权限,使你能够阅读手机状态。

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

第一件事就是创建一个广播reciever: 1)添加到体现

2)reciever:

public class CallReciever extends BroadcastReceiver 
{ 

@Override 
public void onReceive(Context context, Intent intent) 
{ 
    String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE); 
    ArrayList<String> rejectList=getListFromDb()//you need to implement this method 
    if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) 
    { 
     String num = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER); 
     if (rejectList.Contains(num)) 
     { 
      disconnectCall(); 


     } 
    } 
public void disconnectCall(){ 
    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.e("GABI", 
       "FATAL ERROR: could not connect to telephony subsystem"); 
     Log.e("GABI", "Exception object: " + e); 
    } 
    } 

} 

现在,一旦你开始你的应用程序至少一次这样才有效。 (你可以打电话给你的应用程序中使用另一个reciever,将调用startActivity在启动时自动服务) 的permisions并声明它是:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
<receiver android:name="com.my.CustomReceiver"> 
    <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED" /> 
    </intent-filter> 
</receiver>