您的位置:首页 > 移动开发 > Android开发

Android端来电拦截的模块实现

2015-08-30 23:07 323 查看

安卓手机来电拦截模块

电话拦截这项功能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



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: