我正在开发一个应用程序,我需要阻止这个少年 在驾驶时使用手机,我需要阻止通话和 短信。请帮忙 。任何小提示和线索都可以。请帮帮我!
答案 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) {
...
}
}