如何在Android 4.2中阻止呼叫

时间:2015-06-16 23:09:55

标签: android call block

我的注意事项:正如我在最初的帖子中已经澄清的那样,我不认为它是重复的, 我已经尝试过这些方法但它对我不起作用, 以下代码似乎仅适用于2.2,它需要 MODIFY_PHONE_STATE ,这在Android 2.2 ****之后是不允许的

这不是重复的问题,因为我已经在这里看了很多其他帖子,它对我不起作用 我按照以下链接中的解决方案: block phone call

TelephonyManager tm = (TelephonyManager)   
context.getSystemService(Context.TELEPHONY_SERVICE);
Class<?> c = Class.forName(tm.getClass().getName());
Method m = c.getDeclaredMethod("getITelephony");

但是在真实设备(Android 4.2)上运行时,代码会给我异常 java.lang.NoSuchMethodException:getITelephony

那么,是否仍然可以在Android 4.2上使用此解决方案,如果没有,是否存在其他可以尝试的解决方案?

提前多多感谢

1 个答案:

答案 0 :(得分:1)

创建一个名为ITelephony.aidl的文件,它应包含以下数据:

package com.android.internal.telephony; 
interface ITelephony
{ 

  boolean endCall();     

  void answerRingingCall();      

  void silenceRinger(); 

}

在src

下创建这些文件夹
  

android&gt;内部&gt;电话

然后将ITelephony.adl放在电话文件夹下。

复制此DeviceStateListener类并将其放在项目的任何包下。

import android.content.Context;
import android.os.RemoteException;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import java.lang.reflect.Method;

public class DeviceStateListener extends PhoneStateListener {
    private ITelephony telephonyService;
    private Context context;
    public DeviceStateListener(Context context) {
        this.context = context;
        initializeTelephonyService();
    }
    private void initializeTelephonyService() {
        try {
            TelephonyManager telephonyManager = (TelephonyManager) context
                    .getSystemService(Context.TELEPHONY_SERVICE);
            Class clase = Class.forName(telephonyManager.getClass().getName());
            try{
                Method method = clase.getDeclaredMethod("getITelephony");
            }catch (NoSuchMethodException e){
                e.printStackTrace();
            }
            method.setAccessible(true);
            telephonyService = (ITelephony) method.invoke(telephonyManager);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onCallStateChanged(int state, final String incomingNumber) {
        switch (state) {
            case TelephonyManager.CALL_STATE_RINGING:
                boolean isNumberIsBlocked=false;
                // You can check here if incomingNumber string is under your blacklisted numbers
                if (isNumberIsBlocked) {
                    try {
                // This is the main code that block the incoming call.
                        telephonyService.endCall();
                        Thread t = new Thread(new Runnable() {
                            @Override
                            public void run() {
                                // You can run anything here lets say a notice to the user if a call is blocked
                            }
                        });
                        t.start();
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                }
                break;
        }
    }
}

这是另一个重要的课程&#34; ServiceReceiver&#34;将它放在项目的任何包装下并解决所有可能的进口。

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;

public class ServiceReciever extends BroadcastReceiver
{

    private static TelephonyManager telephony;
    private static DeviceStateListener phoneListener;
    private static boolean firstTime=true;

    public ServiceReciever(Context context)
    {
        telephony=(TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
        phoneListener=new DeviceStateListener(context);
    }

    @Override
    public void onReceive(Context context, Intent intent)
    {
        if(firstTime)
        {
            telephony.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE);
            firstTime = false;
        }
    }

    // You can use this in the future to stop the call blocker feature.
    public void stopListening() {
        telephony.listen(phoneListener, PhoneStateListener.LISTEN_NONE);
        firstTime=true;
    }

}

复制此CallBlockerService类并将其放在项目的任何包中。它是一个不可杀死的服务,它调用ServiceReceiver类。

import android.app.NotificationManager;
import android.app.Service;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import com.katadigital.phone.callsmsblocker.callListener.ServiceReciever;

public class CallBlockerService extends Service {

    public static final int notification_id = 111;

    // ---------------------------------------
    // Listening Services
    // ---------------------------------------
    private static ServiceReciever service;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        service = new ServiceReciever(getApplicationContext());
        registerReceiver(service, new IntentFilter(
                "android.intent.action.PHONE_STATE"));
        System.out.println("Call blocker is running now");
    }

    @Override
    public void onDestroy() {
        service.stopListening();
        unregisterReceiver(service);
        service = null;
        cancelStatusBarNotification();
        super.onDestroy();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }

    public void cancelStatusBarNotification() {
        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        manager.cancel(notification_id);
    }
}

将此AfterBootReceiver类放在CallBlockerService旁边。它的工作是在手机从关机状态开始时重启阻止服务。

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class AfterBootReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) 
    {
             Intent serviceLauncher = new Intent(context, CallBlockerService.class);
             context.startService(serviceLauncher);
    }
}

最后将其放在AndroidManifest标签下。

<receiver android:name="com.callblocker.services.AfterBootReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>

        <service android:name="com.callblocker.services.CallBlockerService" >
        </service>

替换&#34; com.callblocker.services&#34;使用CallBlockerService和AfterBootReceiver的文件夹位置

我已经测试了这段代码,直到Android 4.4 KitKat。我希望你能按照步骤操作,它可以帮助你解决问题。