安卓在服务里实现来去电归属地----在服务里比在广播接收者里好

第一步,写一个类继承于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">
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值