【移动应用开发技术】Android中怎么实现电话拦截和电话录音功能_第1页
【移动应用开发技术】Android中怎么实现电话拦截和电话录音功能_第2页
【移动应用开发技术】Android中怎么实现电话拦截和电话录音功能_第3页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】Android中怎么实现电话拦截和电话录音功能

使用BordercastReceiver和Service组件实现下述功能:当拨打电话或电话状态发生改变时,系统就会发出有序广播,因此我们可以使用BordercastReceiver接受广播,因BordercastReceiver执行时间短不能执行耗时任务也不能使用子线程,因此我们应启动一个Service来监听电话并进行处理二、加入AIDL文件AndroidStudio会自动编译产生对应的类文件三、编写TelReceiver组件public

class

TelReceiver

extends

BroadcastReceiver

{

public

TelReceiver()

{

}

@Override

public

void

onReceive(Context

context,

Intent

intent)

{

Intent

i=new

Intent(context,ListenPhoneService.class);

i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

i.setAction(intent.getAction());

i.putExtra(TelephonyManager.EXTRA_INCOMING_NUMBER,

intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER));//电话号码

i.putExtra(TelephonyManager.EXTRA_STATE,

intent.getStringExtra(TelephonyManager.EXTRA_STATE));//电话状态

context.startService(i);//启动服务

}

}public

class

TelReceiver

extends

BroadcastReceiver

{

public

TelReceiver()

{

}

@Override

public

void

onReceive(Context

context,

Intent

intent)

{

Intent

i=new

Intent(context,ListenPhoneService.class);

i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

i.setAction(intent.getAction());

i.putExtra(TelephonyManager.EXTRA_INCOMING_NUMBER,

intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER));//电话号码

i.putExtra(TelephonyManager.EXTRA_STATE,

intent.getStringExtra(TelephonyManager.EXTRA_STATE));//电话状态

context.startService(i);//启动服务

}

}<receiver

android:name=".TelReceiver"

>

<intent-filter

android:priority="1000"

>

<action

android:name="ent.action.PHONE_STATE"

/>

<action

android:name="ent.action.NEW_OUTGOING_CALL"

/>

</intent-filter>

</receiver>

四、编写ListenPhoneService组件public

class

ListenPhoneService

extends

Service

{

private

AudioManager

mAudioManager;

private

TelephonyManager

tm;

public

ListenPhoneService()

{

}

@Override

public

void

onCreate()

{

super.onCreate();

mAudioManager=(AudioManager)getSystemService(Context.AUDIO_SERVICE);

tm=(TelephonyManager)getSystemService(Service.TELEPHONY_SERVICE);

}

@Override

public

int

onStartCommand(Intent

intent,

int

flags,

int

startId)

{

if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){//去电广播,android没有来电话广播

}else{//去掉拨打电话就是来电状态了

//方法1

//获得来电电话

//

String

number=intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);

//获得电话状态

//

String

state=intent.getStringExtra(TelephonyManager.EXTRA_STATE);

//

Log.d("jereh",

"incoming

phone:"

+

number);

//

Log.d("jereh","call

state:"+state);

//

TelephonyManager.EXTRA_STATE_IDLE:

没有来电

或者

挂断

//

TelephonyManagerEXTRA_STATE_OFFHOOK:

接起电话

//

TelephonyManager.EXTRA_STATE_RINGING:当电话呼入时,响铃时

//

if(state.equals(TelephonyManager.EXTRA_STATE_RINGING)){

//

if(number.equals()){//拦截指定的电话号码

//

mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);

//

Log.d("jereh","电话被拦截");

//

stopCall();

//

mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);//恢复铃声

//

}

//

}else

if(state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){

//接起电话

//

recordCall();//开始录音

//

}else

if(state.equals(TelephonyManager.EXTRA_STATE_IDLE)){

//

stopCall();//停止录音

//

}

//方法2

//

设置一个监听器,监听电话状态

tm.listen(listener,PhoneStateListener.LISTEN_CALL_STATE);

}

return

super.onStartCommand(intent,

flags,

startId);

}

/**

*

挂断电话

*/

private

void

stopCall(){

try

{

//Android的设计将ServiceManager隐藏了,所以只能使用反射机制获得。

Method

method=Class.forName("android.os.ServiceManager").getMethod("getService",

String.class);

IBinder

binder=(IBinder)method.invoke(null,

new

Object[]{"phone"});//获得系统电话服务

ITelephony

telephoney=ITelephony.Stub.asInterface(binder);

telephoney.endCall();//挂断电话

stopSelf();//停止服务

}

catch

(Exception

e)

{

e.printStackTrace();

}

}

PhoneStateListener

listener=new

PhoneStateListener(){

@Override

public

void

onCallStateChanged(int

state,String

incomingNumber){

switch

(state){

//手机空闲了

case

TelephonyManager.CALL_STATE_IDLE:

stopCall();//停止录音

break;

//接起电话

case

TelephonyManager.CALL_STATE_OFFHOOK:

recordCall();//开始录音

break;

//

响铃时

case

TelephonyManager.CALL_STATE_RINGING:

Log.e("jereh",

"来电号码是:"+

incomingNumber);

//

如果该号码属于黑名单

if

(incomingNumber.equals("123456"))

{

//

如果是黑名单,就进行屏蔽

stopCall();

}

break;

}

}

};

/**

*

停止录音

*/

private

void

stopRecord(){

if(recording){

recorder.stop();

recorder.release();

recording=false;

stopSelf();//停止服务

}

}

/**

*

电话录音

*/

private

MediaRecorder

recorder;

private

boolean

recording

;

private

void

recordCall(){

Log.d("jereh",

"record

calling")

if(

Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){

recorder=new

MediaRecorder();

recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//读麦克风的声音

recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//设置输出格式

recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//

编码方式

File

file=new

File(Environment.getDownloadCacheDirectory().getAbsolutePath(),"recorder");

if(!file.exists()){

file.mkdir();

}

recorder.setOutputFile(file.getAbsolutePath()

+

"/"

+

System.currentTimeMillis()

+

"3gp");//

存放的位置是放在sd卡recorder目录下

try

{

recorder.prepare();

recorder.start();

recording=true;

}

catch

(IOException

e)

{

e.printStackTrace();

}

}

}

@Override

public

IBinder

onBind(Intent

intent)

{

throw

new

UnsupportedOperationException("Not

yet

implemented");

}

}

复制代码

Service

XML配置

<service

android:name=".ListenPhoneService"

android:enabled="true"

android:exported="true"

>

</service>五、***别忘了一些权限的设置<!--

添加访问手机电话状态的权限

-->

<uses-permission

android:name="android.permission.READ_PHONE_STATE"

/>

<!--

拨打电话权限

-->

<uses-permission

android:name="android.permission.CALL_PHONE"

/>

<!--

监听手机去电的权限

-->

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论