【问题标题】:Blocking incoming and outgoing phone calls?阻止来电和去电?
【发布时间】:2015-01-13 05:58:29
【问题描述】:

我想创建一个应用程序,我可以在阻止或允许列表中设置不同的电话号码。是否可以阻止或仅允许某些电话号码,如果可以,我将如何去做。在此先感谢乔纳森。

【问题讨论】:

  • contentObserver 会帮助你
  • 接收呼叫广播并使用电话 ISDL 结束呼叫。电话 isdl 包含结束通话方法,可帮助您结束通话。对于特定号码,您必须与电话经理核对号码

标签: android phone-call


【解决方案1】:

听起来您必须使用已注册的 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 manifest 添加一个权限,使您能够读取手机状态。

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

【讨论】:

    【解决方案2】:

    首先创建一个广播接收器: 1)添加到清单

    2) 接收者:

    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); 
         }
        }
    
    }
    

    现在这仅在您至少启动一次应用后才有效。 (您可以使用另一个调用 startActivity 的接收器调用您的应用程序以在启动时启动服务) 它的权限和声明是:

    <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> 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-05
      • 1970-01-01
      相关资源
      最近更新 更多