如何阻止拨出电话和短信

时间:2011-09-29 09:17:59

标签: android

我正在开发一个应用程序,我需要阻止这个少年 在驾驶时使用手机,我需要阻止通话和 短信。请帮忙 。任何小提示和线索都可以。请帮帮我!

4 个答案:

答案 0 :(得分:11)

此代码将阻止您所有通话(收入和退出)

import java.lang.reflect.Method;

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

import com.CallLogApp.helper.BlockNumberHelper;
import com.CallLogApp.util.UDF;
import com.android.internal.telephony.ITelephony;

public class CustomPhoneStateListener extends PhoneStateListener {

    //private static final String TAG = "PhoneStateChanged";
    Context context;
    public CustomPhoneStateListener(Context context) {
        super();
        this.context = context;
    }

    @Override
    public void onCallStateChanged(int state, String outGoingNumber) {
        super.onCallStateChanged(state, outGoingNumber);

        switch (state) {
            case TelephonyManager.CALL_STATE_IDLE:
                break;
            case TelephonyManager.CALL_STATE_OFFHOOK:
                endCallIfBlocked(outGoingNumber);
                break;
            case TelephonyManager.CALL_STATE_RINGING:
                break;
            default:
                break;
        }

     }

     private void endCallIfBlocked(String outGoingNumber) {
        try {
            // Java reflection to gain access to TelephonyManager's
            // ITelephony getter
            TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
            Class<?> c = Class.forName(tm.getClass().getName());
            Method m = c.getDeclaredMethod("getITelephony");
            m.setAccessible(true);
            com.android.internal.telephony.ITelephony telephonyService = (ITelephony) m.invoke(tm);  

            if (new BlockNumberHelper(context).isBlocked(outGoingNumber))
            {
                telephonyService = (ITelephony) m.invoke(tm);
                telephonyService.silenceRinger();
                telephonyService.endCall();
            }


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

此时CALL_STATE_OFFHOOK状态会在您的通话连接和接听来电时拨打电话

没有任何方法可以让您知道天气是来电还是来电

但你可以结束在两个场景中连接的呼叫

答案 1 :(得分:1)

答案 2 :(得分:0)

要阻止拨打电话,您需要注册PhoneStateListener,如:

telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
telephonyManager.listen(new MyListener(), PhoneStateListener.LISTEN_CALL_STATE);

然后定义您的MyListener类,如:

private class Test extends PhoneStateListener {
    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
        super.onCallStateChanged(state, incomingNumber);


        switch(state)
        {
        case TelephonyManager.CALL_STATE_IDLE:
            break;
        case TelephonyManager.CALL_STATE_OFFHOOK://this case is for outgoing call 
            break;
        case TelephonyManager.CALL_STATE_RINGING://this case is for incoming call
            break;
        default:
            break;
        }

    }
}

答案 3 :(得分:0)

添加Dharmendra的答案说:

  

没有任何方法可以知道是否是来电   或拨打电话

事实上,有。

要区分来电和拨出电话,您还必须收听Intent.ACTION_NEW_OUTGOING_CALL。 现在:

当您第一次看到Intent.ACTION_NEW_OUTGOING_CALL然后看到CALL_STATE_OFFHOOK时,这是一个外拨电话;

当您第一次看到CALL_STATE_RINGING然后CALL_STATE_OFFHOOK时,这是来电。

第二,您可以使用PhoneStateListener或收听TelephonyManager.ACTION_PHONE_STATE_CHANGED。从我所看到的情况来看,BroadcastReceiver首先收到意图,然后通知PhoneStateListener

final IntentFilter theFilter = new IntentFilter();
theFilter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
theFilter.addAction(Intent.ACTION_NEW_OUTGOING_CALL);
mBroadcastReceiver = new MyBroadcastReceiver();
mService.registerReceiver(mBroadcastReceiver, theFilter);

class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        ...
    }
}