安卓手机来电拦截模块
电话拦截这项功能google屏蔽了,所有得自己去找aidl文件来反射实现来电的拦截,下面是一个简单的来电拦截模块代码实现.
❶需要注意的是:所需要的权限
<!-- 权限 -->
<span style="color:#cc0000;"> <uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-permission android:name="android.permission.WRITE_CALL_LOG" /></span>
❷主函数的代码
import com.hui.server.PhoneServer;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends ActionBarActivity
{
private EditText mEd;
private Button mBn;
private static boolean BUTTON_STATE = true;
private String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_main);
mEd = (EditText) findViewById (R.id.main_ed);
mBn = (Button) findViewById (R.id.main_bn);
mBn.setOnClickListener (new OnClickListener () {
@Override
public void onClick(View v){
if (BUTTON_STATE) {
BUTTON_STATE = false;
mEd.setEnabled (false);
mBn.setText ("解除拦截");
startMyService();
}else {
BUTTON_STATE = true;
mEd.setEnabled (true);
mBn.setText ("确认拦截");
stopMyService();
}
}
});
}
public void startMyService(){
String phoneNumber = mEd.getText ().toString ();
// 数据保存到 缓存中
Log.d (TAG, "界面输入的电话号码:" + phoneNumber);
// 第一种:获取电话号码的方法,先把号码写入缓存,然后在service那边获取
//PreferenceUtils.putString (getApplicationContext (), "number", phoneNumber);
Intent intent = new Intent ();
// 第二种:直接用 put 过去
intent.putExtra ("number", phoneNumber); // 把电话传过去
intent.setClass (MainActivity.this, PhoneServer.class);
// 开启服务
startService (intent);
}
public void stopMyService(){
stopService (new Intent (MainActivity.this, PhoneServer.class));
}
}
❸服务中的代码
import java.lang.reflect.Method;
import com.android.internal.telephony.ITelephony;
import android.app.Service;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
public class PhoneServer extends Service
{
private TelephonyManager mTm;
private String TAG = "PhoneServer";
private String phoneNumber;
@Override
public void onCreate(){
Log.d (TAG, "服务开启");
super.onCreate ();
// 缓存的方法把号码弄过来
// 也可以用数据库等形式把数据搞过来
// phoneNumber = PreferenceUtils.getString (getApplicationContext (),
// "number");
Log.d (TAG, "缓存中的电话号码:" + phoneNumber);
// // 搞一个电话管理者
mTm = (TelephonyManager) getSystemService (Context.TELEPHONY_SERVICE);
// 1.拦截电话监听
mTm.listen (mListener, PhoneStateListener.LISTEN_CALL_STATE);
}
private PhoneStateListener mListener = new PhoneStateListener () {
public void onCallStateChanged(int state , final String incomingNumber){
//Log.d (TAG, "电话状态改变!!!");
// state:电话的状态
// * @see TelephonyManager#CALL_STATE_IDLE:闲置状态
// * @see TelephonyManager#CALL_STATE_RINGING:响铃状态
// * @see TelephonyManager#CALL_STATE_OFFHOOK:摘机--》接听状态
// incomingNumber:拨入的电话号码 对比 你在界面上面输入的电话
//Log.d (TAG, "incomingNumber-->" + phoneNumber);
//Log.d (TAG, "setNumber-->" + phoneNumber);
switch (state) {
case TelephonyManager.CALL_STATE_IDLE:
break;
case TelephonyManager.CALL_STATE_RINGING:
Log.d (TAG, "响铃状态!!!");
// 响铃状态--> 判断是否是黑名单---》挂掉电话
if (incomingNumber.equals (phoneNumber)) {
// 需要拦截
// 挂掉电话
<span style="white-space:pre"> </span>// 这里执行反射操作
try {
Class<?> clazz = Class
.forName ("android.os.ServiceManager");
Method method = clazz.getDeclaredMethod ("getService",
String.class);
IBinder binder = (IBinder) method.invoke (null,
Context.TELEPHONY_SERVICE);
ITelephony telephony = ITelephony.Stub.asInterface (binder);
telephony.endCall (); // 挂断电话阻止电话响
Thread.sleep (200); // 稍微延时
// 删除通话记录
final ContentResolver cr = getContentResolver ();
final Uri url = Uri.parse ("content://call_log/calls");
cr.registerContentObserver (url, true,
new ContentObserver (new Handler ()) {
public void onChange(boolean selfChange){
String where = "number=?";
String[] selectionArgs = new String[] { incomingNumber };
cr.delete (url, where, selectionArgs);
};
});
Log.d (TAG, "成功拦截电话成功-----拦截的号码为----->:" + phoneNumber);
} catch (Exception e) {
Log.d (TAG, "拦截出错!!!");
e.printStackTrace ();
}
}
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
break;
default:
break;
}
}
};
public void onDestroy(){
Log.d (TAG, "解除服务");
// 注销监听
mTm.listen (mListener, PhoneStateListener.LISTEN_NONE);
};
// 在启动的时候把号码保存到内存
@Override
public int onStartCommand(Intent intent , int flags , int startId){
phoneNumber = intent.getStringExtra ("number");
Log.d (TAG, "intent电话号码是:" + phoneNumber);
return super.onStartCommand (intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent){
return null;
}
}
❹源代码,自己下把
下载地址:http://download.csdn.net/detail/u010381752/9065395