Блокировка входящих и исходящих телефонных звонков? - PullRequest
0 голосов
/ 06 августа 2011

Я хотел бы создать приложение, в котором я смогу устанавливать разные телефонные номера в блоке или списке разрешений.Можно ли заблокировать или разрешить только определенные номера телефонов, и если да, то как мне поступить?Заранее спасибо, Джонатан.

Ответы [ 2 ]

0 голосов
/ 13 января 2015

первым делом создайте широковещательный приемник: 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> 
0 голосов
/ 08 октября 2013

Похоже, вам нужно создать Сервис с зарегистрированным 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), а также добавить разрешение в свой манифест андроида, который позволяет вам читать состояние телефона.

      <uses-permission android:name="android.permission.READ_PHONE_STATE" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...