5.短信和电话拦截的服务--判断服务是否在运行(开关服务)

1 判断服务是否在运行

package org.heima.mobilesafe01.utils;

import java.util.List;

import android.app.ActivityManager;
import android.app.Service;
import android.app.ActivityManager.RunningServiceInfo;
import android.content.ComponentName;
import android.content.Context;

public class ServiceStatusUtils {

	/**
	 * @param context
	 * @param cls
	 * @return 判断服务是否在运行
	 */
	public static boolean isServiceRunning(Context context,
			Class<? extends Service> cls) {
		// ActivityManager:动态
		// PackageManager:静态
		// 1 获取方式
		ActivityManager am = (ActivityManager) context
				.getSystemService(Context.ACTIVITY_SERVICE);

		List<RunningServiceInfo> runningInfos = am
				.getRunningServices(Integer.MAX_VALUE);
		for (RunningServiceInfo info : runningInfos) {
			ComponentName service=info.service;
			if(service.getClassName().equals(cls.getName())){
				return true;
			}
		}
		return false;
	}

}


2 开关一个服务

	@OnClick(R.id.siv_call_sms_safe)
	public void isCallSmsSafe(View view) {
		Intent service = new Intent(this, CallSmsSafeService.class);
		if (ServiceStatusUtils.isServiceRunning(this, CallSmsSafeService.class)) {// 是
			stopService(service);
		} else {// 否
			startService(service);
		}
		sivCallSmsSafe.toggle();
	}

	@OnClick(R.id.siv_address)
	public void setAddress(View view) {
		Intent service = new Intent(this, AddressService.class);
		if (ServiceStatusUtils.isServiceRunning(this, AddressService.class)) {// 是
			stopService(service);
		} else {// 否
			startService(service);
		}
		sivAddress.toggle();
	}


3 短信和电话拦截的服务

package org.heima.mobilesafe01.service;

import java.lang.reflect.Method;

import org.heima.mobilesafe01.db.BlackDao;
import org.heima.mobilesafe01.utils.BlackUtils;
import org.heima.mobilesafe01.utils.L;

import com.android.internal.telephony.ITelephony;

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.ContentObserver;
import android.media.MediaRecorder;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.provider.CallLog;
import android.provider.CallLog.Calls;
import android.telephony.PhoneStateListener;
import android.telephony.SmsMessage;
import android.telephony.TelephonyManager;

/**
 * @author U 短信和电话拦截的服务
 */
public class CallSmsSafeService extends Service {

	private SmsReceiver mSmsReceiver;
	private BlackDao mBlackDao;
	private TelephonyManager mTm;
	private CallSmsSafeListener mCallSmsSafeListener;

	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}

	@Override
	public void onCreate() {
		super.onCreate();
		L.d("CallSmsSafeService:onCreate");
		mBlackDao = new BlackDao(this);
		// 监听短信
		mSmsReceiver = new SmsReceiver();
		// <intent-filter android:priority="1000" >
		// <action android:name="android.provider.Telephony.SMS_RECEIVED" />
		// </intent-filter>
		IntentFilter filter = new IntentFilter();
		filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
		filter.addAction("android.provider.Telephony.SMS_RECEIVED");
		registerReceiver(mSmsReceiver, filter);
		mTm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
		mCallSmsSafeListener = new CallSmsSafeListener();
		mTm.listen(mCallSmsSafeListener, PhoneStateListener.LISTEN_CALL_STATE);
	}

	// 电话窃听器:接听:录音(MediaRecorder:start),挂断
	// 停止录音(MediaRecorder:stop,release)--->new Thread--->传到服务器
	class CallSmsSafeListener extends PhoneStateListener {
		@Override
		public void onCallStateChanged(int state, final String incomingNumber) {
			super.onCallStateChanged(state, incomingNumber);
			L.d("incomingNumber:" + incomingNumber);
			switch (state) {
			case TelephonyManager.CALL_STATE_IDLE:// 没接通电话的时候
				L.d("CALL_STATE_IDLE");
				break;
			case TelephonyManager.CALL_STATE_RINGING:// 响铃
				L.d("CALL_STATE_RINGING");
				// 电话拦截
				int type = mBlackDao.getType(incomingNumber);
				if (type == BlackUtils.BLACK_TYPE_CALL
						|| type == BlackUtils.BLACK_TYPE_ALL) {
					L.d("电话拦截");
					try {
						// 第一关(去一个网站下载:aidl(ITelephony.aidl,NeighboringCellInfo.aidl))
						// endCall--->ITelephony:endCall--->ITelephony.aidl
						// ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE));
						// 第二关
						// ITelephony
						// telephony=ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE));
						// 反射
						// 1 找到class
						Class cls = Class.forName("android.os.ServiceManager");
						// 2 找到对象
						// 3 获取Method
						Method method = cls.getDeclaredMethod("getService",
								String.class);
						// 4 调用
						IBinder binder = (IBinder) method.invoke(null,
								Context.TELEPHONY_SERVICE);
						ITelephony telephony = ITelephony.Stub
								.asInterface(binder);
						telephony.endCall();
						// 自动接听(需要系统的app的权限,玩不转)
						// telephony.answerRingingCall();
						// 删除通话记录(ContentResovler)(当内容发送改变的时候,才可以去删除)
						// getContentResolver().delete(CallLog.Calls.CONTENT_URI,
						// "number=?", new String[] { incomingNumber });
						// 其他的方式
						// content://call_log/calls/a
						getContentResolver().registerContentObserver(
								CallLog.Calls.CONTENT_URI, true,
								new ContentObserver(new Handler()) {
									@Override
									public void onChange(boolean selfChange) {
										super.onChange(selfChange);
										getContentResolver()
												.delete(CallLog.Calls.CONTENT_URI,
														"number=?",
														new String[] { incomingNumber });
										// 用一次之后,取消监听
										getContentResolver().unregisterContentObserver(this);
									}
								});
					} catch (Exception e) {
						// TODO: handle exception
					}

				}
				break;
			case TelephonyManager.CALL_STATE_OFFHOOK:// 接通
				L.d("CALL_STATE_OFFHOOK");
				break;
			default:
				break;
			}
		}
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
		L.d("CallSmsSafeService:onDestroy");
		if (mSmsReceiver != null) {
			// 取消短信监听
			unregisterReceiver(mSmsReceiver);
		}

		// 取消电话的监听
		if (mCallSmsSafeListener != null) {
			mTm.listen(mCallSmsSafeListener, PhoneStateListener.LISTEN_NONE);
		}
	}

	class SmsReceiver extends BroadcastReceiver {

		@Override
		public void onReceive(Context context, Intent intent) {
			// 获取发送者短信号码
			Object[] objs = (Object[]) intent.getExtras().get("pdus");
			for (Object obj : objs) {
				SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) obj);
				String sender = smsMessage.getOriginatingAddress();
				// 短信拦截类型 或 全部类型
				int type = mBlackDao.getType(sender);
				if (type == BlackUtils.BLACK_TYPE_SMS
						|| type == BlackUtils.BLACK_TYPE_ALL) {
					L.d("短信拦截");
					//
					abortBroadcast();
				}
			}

		}
	}

}






ITelephony.aidl

/*
 * Copyright (C) 2007 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.internal.telephony;

import android.os.Bundle;
import java.util.List;
import android.telephony.NeighboringCellInfo;

/**
 * Interface used to interact with the phone.  Mostly this is used by the
 * TelephonyManager class.  A few places are still using this directly.
 * Please clean them up if possible and use TelephonyManager insteadl.
 *
 * {@hide}
 */
interface ITelephony {

    /**
     * Dial a number. This doesn't place the call. It displays
     * the Dialer screen.
     * @param number the number to be dialed. If null, this
     * would display the Dialer screen with no number pre-filled.
     */
    void dial(String number);

    /**
     * Place a call to the specified number.
     * @param number the number to be called.
     */
    void call(String number);

    /**
     * If there is currently a call in progress, show the call screen.
     * The DTMF dialpad may or may not be visible initially, depending on
     * whether it was up when the user last exited the InCallScreen.
     *
     * @return true if the call screen was shown.
     */
    boolean showCallScreen();

    /**
     * Variation of showCallScreen() that also specifies whether the
     * DTMF dialpad should be initially visible when the InCallScreen
     * comes up.
     *
     * @param showDialpad if true, make the dialpad visible initially,
     *                    otherwise hide the dialpad initially.
     * @return true if the call screen was shown.
     *
     * @see showCallScreen
     */
    boolean showCallScreenWithDialpad(boolean showDialpad);

    /**
     * End call or go to the Home screen
     *
     * @return whether it hung up
     */
    boolean endCall();

    /**
     * Answer the currently-ringing call.
     *
     * If there's already a current active call, that call will be
     * automatically put on hold.  If both lines are currently in use, the
     * current active call will be ended.
     *
     * TODO: provide a flag to let the caller specify what policy to use
     * if both lines are in use.  (The current behavior is hardwired to
     * "answer incoming, end ongoing", which is how the CALL button
     * is specced to behave.)
     *
     * TODO: this should be a oneway call (especially since it's called
     * directly from the key queue thread).
     */
    void answerRingingCall();

    /**
     * Silence the ringer if an incoming call is currently ringing.
     * (If vibrating, stop the vibrator also.)
     *
     * It's safe to call this if the ringer has already been silenced, or
     * even if there's no incoming call.  (If so, this method will do nothing.)
     *
     * TODO: this should be a oneway call too (see above).
     *       (Actually *all* the methods here that return void can
     *       probably be oneway.)
     */
    void silenceRinger();

    /**
     * Check if we are in either an active or holding call
     * @return true if the phone state is OFFHOOK.
     */
    boolean isOffhook();

    /**
     * Check if an incoming phone call is ringing or call waiting.
     * @return true if the phone state is RINGING.
     */
    boolean isRinging();

    /**
     * Check if the phone is idle.
     * @return true if the phone state is IDLE.
     */
    boolean isIdle();

    /**
     * Check to see if the radio is on or not.
     * @return returns true if the radio is on.
     */
    boolean isRadioOn();

    /**
     * Check if the SIM pin lock is enabled.
     * @return true if the SIM pin lock is enabled.
     */
    boolean isSimPinEnabled();

    /**
     * Cancels the missed calls notification.
     */
    void cancelMissedCallsNotification();

    /**
     * Supply a pin to unlock the SIM.  Blocks until a result is determined.
     * @param pin The pin to check.
     * @return whether the operation was a success.
     */
    boolean supplyPin(String pin);

    /**
     * Handles PIN MMI commands (PIN/PIN2/PUK/PUK2), which are initiated
     * without SEND (so <code>dial</code> is not appropriate).
     *
     * @param dialString the MMI command to be executed.
     * @return true if MMI command is executed.
     */
    boolean handlePinMmi(String dialString);

    /**
     * Toggles the radio on or off.
     */
    void toggleRadioOnOff();

    /**
     * Set the radio to on or off
     */
    boolean setRadio(boolean turnOn);

    /**
     * Request to update location information in service state
     */
    void updateServiceLocation();

    /**
     * Enable location update notifications.
     */
    void enableLocationUpdates();

    /**
     * Disable location update notifications.
     */
    void disableLocationUpdates();

    /**
     * Enable a specific APN type.
     */
    int enableApnType(String type);

    /**
     * Disable a specific APN type.
     */
    int disableApnType(String type);

    /**
     * Allow mobile data connections.
     */
    boolean enableDataConnectivity();

    /**
     * Disallow mobile data connections.
     */
    boolean disableDataConnectivity();

    /**
     * Report whether data connectivity is possible.
     */
    boolean isDataConnectivityPossible();

    Bundle getCellLocation();

    /**
     * Returns the neighboring cell information of the device.
     */
    List<NeighboringCellInfo> getNeighboringCellInfo();

     int getCallState();
     int getDataActivity();
     int getDataState();

    /**
     * Returns the current active phone type as integer.
     * Returns TelephonyManager.PHONE_TYPE_CDMA if RILConstants.CDMA_PHONE
     * and TelephonyManager.PHONE_TYPE_GSM if RILConstants.GSM_PHONE
     */
    int getActivePhoneType();

    /**
     * Returns the CDMA ERI icon index to display
     */
    int getCdmaEriIconIndex();

    /**
     * Returns the CDMA ERI icon mode,
     * 0 - ON
     * 1 - FLASHING
     */
    int getCdmaEriIconMode();

    /**
     * Returns the CDMA ERI text,
     */
    String getCdmaEriText();

    /**
     * Returns true if CDMA provisioning needs to run.
     */
    boolean getCdmaNeedsProvisioning();

    /**
      * Returns the unread count of voicemails
      */
    int getVoiceMessageCount();

    /**
      * Returns the network type
      */
    int getNetworkType();
    
    /**
     * Return true if an ICC card is present
     */
    boolean hasIccCard();
}
NeighboringCellInfo.aidl

/* //device/java/android/android/content/Intent.aidl
**
** Copyright 2007, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
**     http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/

package android.telephony;

parcelable NeighboringCellInfo;




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值