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
相关文章推荐
- Android自定义控件
- Android中多媒体文件、文档以及各类文件的获取
- Android传感器
- Android传感器
- Android百分比布局支持库介绍——com.android.support:percent
- android url知识
- android url知识
- android url知识
- android url知识
- android url知识
- android url知识
- android url知识
- android url知识
- android url知识
- android url知识
- android url知识
- android url知识
- android url知识
- android url知识
- android url知识