第一步,写一个类继承于Service
第二步,在manifest文件里注册服务
第三步,添加监听去电的权限,和监听来电的权限
package com.example.mobilsafe.Service;
import java.util.zip.Inflater;
import com.example.mobilsafe.R;
import com.example.mobilsafe.tools.NumberAddressQuery;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.drm.DrmStore.RightsStatus;
import android.graphics.PixelFormat;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.widget.Filter;
import android.widget.TextView;
public class AddressService extends Service {
TelephonyManager tm; //电话管理器
myPhoneStateListener listener; //电话状态监听器
WindowManager wm; //窗口管理器
OutCallBroadCastReceiver receiver; //去电监听的广播接收类
View v; //自定义Toast的类
SharedPreferences sf;
Editor et;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
sf=getSharedPreferences("config", MODE_PRIVATE);
tm=(TelephonyManager) getSystemService(TELEPHONY_SERVICE);
wm=(WindowManager) getSystemService(WINDOW_SERVICE);
<span style="white-space:pre"> </span>//来电监听
listener=new myPhoneStateListener();
tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
<span style="white-space:pre"> </span>//去电监听
receiver=new OutCallBroadCastReceiver();
IntentFilter filter=new IntentFilter();
filter.addAction("android.intent.action.NEW_OUTGOING_CALL");
registerReceiver(receiver, filter);
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
//取消监听来电
if(listener!=null){
tm.listen(listener,PhoneStateListener.LISTEN_NONE);
listener=null;
}
//取消监听去电
if(receiver!=null){
unregisterReceiver(receiver);
}
}
/**
* 监听响铃状态和空闲状态
* @author Administrator
*
*/
class myPhoneStateListener extends PhoneStateListener{
@Override
public void onCallStateChanged(int state, String incomingNumber) {
// TODO Auto-generated method stub
super.onCallStateChanged(state, incomingNumber);
switch(state){
case TelephonyManager.CALL_STATE_RINGING: //响铃状态
Log.i("huang", "响铃状态");
showAddress(incomingNumber);
break;
case TelephonyManager.CALL_STATE_IDLE: //空闲状态,也就是挂掉的时候
Log.i("huang", "空闲状态");
if(v!=null){
wm.removeView(v);
v=null;
}
break;
}
}
}
/**
* 监听去电的广播
* @author Administrator
*
*/
public class OutCallBroadCastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
// 去电监听
// 获得去电的号码
String number = getResultData();
showAddress(number);
}
}
/**
* 自定义Toast
* @param number
*/
public void showAddress(String number){
v=View.inflate(AddressService.this, R.layout.activity_mytoast, null);
int [] bg={R.drawable.call_locate_blue,R.drawable.call_locate_gray,R.drawable.call_locate_green};
TextView tv_mytoast=(TextView) v.findViewById(R.id.tv_mytoast);
tv_mytoast.setBackgroundResource(bg[sf.getInt("addressbg", 0)]);
tv_mytoast.setText(NumberAddressQuery.getAddress(number));
WindowManager.LayoutParams params = new WindowManager.LayoutParams();
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
params.width = WindowManager.LayoutParams.WRAP_CONTENT;
params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
params.format = PixelFormat.TRANSLUCENT;
params.type = WindowManager.LayoutParams.TYPE_TOAST;
params.setTitle("Toast");
wm.addView(v, params);
}
}
在oncreate方法里注册来去电监听
在destroy方法里取消监听
1,监听电话状态需要用到TelePhoneManager(电话管理器),
tm=(TelephonyManager) getSystemService(TELEPHONY_SERVICE);//获取电话管理器
然后通过<span style="font-family: Arial, Helvetica, sans-serif;">tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE)进行注册监听</span>
<span style="font-family: Arial, Helvetica, sans-serif;">第一个参数是监听电话状态的类,当电话状态改变时会回调里面的</span><span style="font-family: Arial, Helvetica, sans-serif;">onCallStateChanged()方法</span>
<span style="font-family:Arial, Helvetica, sans-serif;">第二个参数表示监听来电</span>
<span style="font-family:Arial, Helvetica, sans-serif;">
</span>
2,监听去电则用广播接受者来监听,通过代码的形式来注册广播监听
<pre name="code" class="java">通过registerReceiver(receiver, filter进行注册监听
第一个参数是广播接收的类,第二个参数相当于在Manifest文件里注册广播接受者的intent-filter一样,
往intent-filter里添加一个监听的动作
在manifest文件里注册服务
<pre name="code" class="html"> <!--监听来去电的服务 -->
<service android:name="com.example.mobilsafe.Service.AddressService" />
需要的权限
<pre name="code" class="html"><!--去电权限 -->
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<!-- 来电权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<span style="font-family: Arial, Helvetica, sans-serif;"></span><pre name="code" class="java">