电话窃听和拦截应用

今天学习了进程间Service的通信-->AIDL,基于前几天学习的广播机制,我做了一个简单的电话窃听和录音应用。现将具体实现方法附在下面,供大家参考,希望大家提供一些宝贵的意见。

业务需求分析:

  1.当手机处于开机状态,监听服务就要启动,对来电进行监听录音。

  2.设置电话黑名单,当来电是黑名单电话,则直接挂断。

实现步骤:

首先我们要定义一个电话监听的服务,对来电进行监听录音和拦截。具体代码如下:

PhoneListenerService:

package cn.yj3g.L21_PhoneListener;

import java.lang.reflect.Method;

import com.android.internal.telephony.ITelephony;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.Environment;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Toast;

public class PhoneListenerService extends Service {

    private MediaRecorder recorder;
    private boolean recording = false;
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    @Override
    public void onCreate() {
        Log.v("TAG", "service onCreate()");
        super.onCreate();
        //电话服务管理
        TelephonyManager manager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        //监听电话状态
        manager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
    }

    private PhoneStateListener listener = new PhoneStateListener() {
        /*
         * @see TelephonyManager#CALL_STATE_IDLE 值为0
         *
         * @see TelephonyManager#CALL_STATE_RINGING 值为1
         *
         * @see TelephonyManager#CALL_STATE_OFFHOOK 值为2
         */
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            super.onCallStateChanged(state, incomingNumber);
            //打印电话状态改变信息
            Log.v("TAG", "onCallStateChanged state=" + state);
            switch (state) {
            case TelephonyManager.CALL_STATE_IDLE: // 没有来电 或者 挂断
                stopRecord();
                break;
            case TelephonyManager.CALL_STATE_RINGING: // 响铃时
                stop(incomingNumber);
                break;
            case TelephonyManager.CALL_STATE_OFFHOOK: // 接起电话
                recordCalling();
                break;
            default:
                break;
            }
        }

    };
    //停止录音
    private void stopRecord() {
        Log.v("TAG", "stopRecord");
        if (recording) {
            recorder.stop();
            recorder.release();
            recording=false;
        }
    }
    //电话拦截
    public void stop(String s) {
        try {
            if (s.equals("110")) {
                Toast.makeText(this, "拦截成功", 0).show();
                Log.e("TAG", "此来电为黑名单号码,已被拦截!");
                //调用ITelephony.endCall()结束通话
                Method method = Class.forName("android.os.ServiceManager")
                        .getMethod("getService", String.class);
                IBinder binder = (IBinder) method.invoke(null,
                        new Object[] { TELEPHONY_SERVICE });
                ITelephony telephony = ITelephony.Stub.asInterface(binder);
                telephony.endCall();
            } else
                Toast.makeText(this, "不需拦截", 0).show();
            recording=false;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //进行录音
    private void recordCalling() {
        try {
            Log.v("TAG", "recordCalling");
            recorder = new MediaRecorder();
            recorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 读麦克风的声音
            recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);// 输出格式.3gp
            recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);// 编码方式
            recorder.setOutputFile(Environment.getExternalStorageDirectory()
                    .getAbsolutePath()
                    + "/"
                    + System.currentTimeMillis()
                    + ".3gp");// 存放的位置是放在sdcard目录下
            recorder.prepare();
            recorder.start();
            recording = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Android没有对外公开结束通话的API,如果需要结束通话,必须使用AIDL与电话管理服务进行通信,

并调用服务中的API实现结束通话,方法如下:

1.从Android的源代码中拷贝以下文件到项目中:

com/android/internal/telephony/ITelephony.aidl

android/telephony/NeighboringCellInfo.aidl

如下图所示.开发工具会在gen目录下自动生成ITelephony.java

我们知道服务不能自己启动,需要手动启动,所以我们需要一个广播,当手机刚开机,我们就发送广播,启动监听电话的服务。下面是我写的一个发送广播的Receiver

package cn.yj3g.L21_PhoneListener;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class BootCompleteReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        //运用广播开启监听这个服务
        Log.v("TAG", "开机了!");
            Intent i = new Intent(context, PhoneListenerService.class);
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//由于之前运行不能实现功能,经老师的修改加上一个任务标志
            context.startService(i);
    }
}

下面就是要在AndroidManifest.xml中配置相关的权限:具体代码如下:

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="cn.yj3g.L21_PhoneListener"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="8" />
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <service android:name=".PhoneListenerService">
            <intent-filter>
              <action android:name="cn.yj3g.L21_PhoneListener.PhoneListenerService" ></action>
            </intent-filter>
        </service>
        <receiver android:name=".BootCompleteReceiver">
            <intent-filter>
             <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
    </application>
       <!-- 读取电话状态权限-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
       <!-- 录音权限 -->
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
      <!-- 向sdcard中写数据的权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
      <!-- 开机启动广播的权限 -->
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
      <!-- 挂断电话时需要的权限 -->
     <uses-permission android:name="android.permission.CALL_PHONE" />
</manifest>

这样一个监听电话的应用就做好了。当安装此应用的手机开机时,来电就处于监听状态,这样就可以不动声色的对该手机的来电进行监听录音或者拦截,以达到不可告人的目的。

时间: 2024-07-28 18:24:40

电话窃听和拦截应用的相关文章

Android 手机卫士7--黑名单拦截

1,黑名单数据库创建 三个字段(_id 自增长字段 phone 黑名单号码 mode 拦截类型) 创建表的sql语句 create table blacknumber (_id integer primary key autoincrement , phone varchar(20), mode varchar(5)); 结合项目,去创建数据库,以及相应的表 2.BlackNumberDao  BlackNumberDao单例模式 1 package com.itheima.mobilesafe

【android基础篇】自定义广播和电话监听

I,自定义广播 前面所说的都是接收短信,外拨电话等都是系统所有的广播,而其实我们可以自己自定义一个广播,并且写一个广播接收者来玩玩. 1) 在按钮的点击方法中,发送自定义的广播: 1 public void click(View view){ 2 /** 3 * 发送自定义的广播 4 */ 5 Intent intent=new Intent(); 6 //设置意图的动作,要和自定义的频道要一致 7 intent.setAction("www.wangchengxiang.com");

tapping of data 词义来源

tapping of data 在数据交互的过程 数据被 窃听到. 例如, 网站的账户被泄露, 在用户登陆过程中, 其账号被第三方偷到. tapping 含义 看看 youdao 词典解释: n. [冶] 出钢:开孔:出渣:轻敲声 v. 轻敲(tap的ing形式):轻拍 n. (Tapping)人名:(英)塔平 貌似, 开孔.放液体 和 分支 比较接近. Telephone tapping (电话窃听) https://en.wikipedia.org/wiki/Telephone_tappin

Android核心基础(手机卫士的一个知识点总结)

注意:有些功能是需要权限的,在这里并没有写出来,在程序运行中,根据程序报的错误,添加相应的权限即可,里面的具体里面可能有一些小细节,没有明确的写出来,具体的需要在程序中自己调试,解决. 这个总结涵盖了Android的一些核心的内容,如四大组建Service.ContentProvider.BroadCastReceiver.Activity,而且四大组建都必须在清单文件中注册. 还涉及了Android手机底层的一些功能,如读取联系人.短信等.还有一些看似牛别点技术,什么短息拦截,电话拦截,黑名单

手机卫士-05

手机卫士-05 课1 模仿网易新闻下拉加载分页数据listView 在activtiycallsafe.xml里重新修改(去掉原来的button) activtiycallsafe.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:l

如何使用SSL pinning来使你的iOS APP更加安全

SSL pinning在构建一个高度安全的移动APP上扮演了一个十分重要的角色.然而如今好多用户在使用无线移动设备去访问无数不安全的无线网络. 这篇文章主要覆盖了SSL pinning 技术,来帮助我们处理最常见的安全攻击--中间人攻击(MITM). SSL(Secure Socket Layer 安全套接字层)确保客户端-服务器在HTTP请求的方式上将通讯内容加密----被指定为HTTPS(SSL上的HTTP).这种加密体系是基于PKI(Pbulic Key Infrastructure,公钥

手机安全卫士——通讯卫士-黑名单的管理

CallSafeActivity .java public class CallSafeActivity extends Activity { private ListView list_view; private List<BlackNumberInfo> blackNumberInfos; private LinearLayout ll_pb; private BlackNumberDao dao; private CallSafeAdapter adapter; /** * 当前页面 *

sipdroid项目结构分析,类的大体作用 比较全

原文地址:http://www.360doc.com/content/14/0527/21/16824943_381548453.shtml 从org.sipdroid.sipua.ui包下面的 Sipdroid 开始,因为程序是从这开始的. sipdroid.xml 这是Sip进入的界面, 启动时程序实例话了一个Sip引擎并进行了注册等操作,用CallsCursor描述了对象,用CallsAdapter适配器显示了它,如果用户没有设置服务 端口与没有设置预设的电话则会弹出对话框进行设置,使用了

zz 【见闻八卦】《金融时报》年度商业书单:互联网题材占一半

[见闻八卦]<金融时报>年度商业书单:互联网题材占一半 文 / 见闻学堂 2014年12月18日 09:47:38 0 中国最好的金融求职培训:见闻学堂(微信号:top-elites) 年末已至,假期还会远吗?是该为假期囤好书的时候啦.如果你正在为选择哪本书而焦虑,那么由<金融时报>为你把关的年度书单绝对值得收藏! 今天重点介绍<金融时报>所公布的2014年度最佳商业图书,托马斯•皮凯蒂(Thomas Piketty)所著的<21世纪资本论>荣获最佳,另外5