电话监听器
来源:互联网 发布:疯狂联盟座狼升级数据 编辑:程序博客网 时间:2024/04/30 12:20
步骤:
1.建立项目
2.写广播类和服务类并在清单文件中指定
3.业务逻辑
主activyty:
package com.sqf.phonelistener;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}/** 电话呼叫所需要的权限READ_PHONE_STATE,不加的错误 Caused by: java.lang.SecurityException: Neither user 10071 nor current process has android.permission.READ_PHONE_STATE. * */ }
监听手机开启,并开启服务:
package com.sqf.phonelistener;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;public class BootReveiver extends BroadcastReceiver {/** * 利用手机的开机的广播,监听 * */@Overridepublic void onReceive(Context context, Intent intent) {Intent i = new Intent(context,SystemService.class);context.startService(i);}}
服务的类:
package com.sqf.phonelistener;import java.io.File;import java.io.IOException;import android.app.Service;import android.content.Intent;import android.content.res.Configuration;import android.media.MediaRecorder;import android.os.Environment;import android.os.IBinder;import android.telephony.PhoneStateListener;import android.telephony.SignalStrength;import android.telephony.TelephonyManager;public class SystemService extends Service {/** * 电话管理器类 * You do not instantiate this class directly; * instead, you retrieve a reference to an instance through * Context.getSystemService(Context.TELEPHONY_SERVICE). * */private TelephonyManager tm;/** * 监听器对象 * */private MyListener listener;/** * 声明录音机 * */private MediaRecorder mediaRecorder;@Overridepublic IBinder onBind(Intent intent) {return null;}/** * 服务创建的时候调用的方法 * */@Overridepublic void onCreate() {//后台监听电话的呼叫状态//的到电话管理器的服务tm = (TelephonyManager) this.getSystemService(this.TELEPHONY_SERVICE);/* PhoneStateListener的静态变量 LISTEN_DATA_ACTIVITY 流量产生的数据 LISTEN_SIGNAL_STRENGTHS 监听信号的强弱 LISTEN_CALL_STATE 监听呼叫的状态 PhoneStateListener.LISTEN_NONE 取消监听 */listener = new MyListener();tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);//tm.getNetworkOperator(); //获取运营商的编码//tm.getNetworkOperatorName() //获取应用上的名字//tm.getNetworkType() 获取网络类型 2g,3g,4g,gprs等//tm.getPhoneType() 获取手机支持网络类型// tm.getSimSerialNumber(); 获取sim卡的序列号//tm.getLine1Number(); //获取手机的电话号码,需要支持simsuper.onCreate();} /** * 服务销毁的时候调用的方法 * */@Overridepublic void onDestroy() {super.onDestroy();//取消电话的监听tm.listen(listener, PhoneStateListener.LISTEN_NONE);Intent i = new Intent(this,SystemService2.class);startService(i);listener = null;}private class MyListener extends PhoneStateListener{/** * 当电话的呼叫状态变化的时候调用的方法 * */@Overridepublic void onCallStateChanged(int state, String incomingNumber) {super.onCallStateChanged(state, incomingNumber);System.out.println("当前电话的状态:"+state);switch (state) {case TelephonyManager.CALL_STATE_IDLE: //没有打接电话,也没有接电话,空闲状态if(mediaRecorder!=null){//8.停止捕获mediaRecorder.stop();//9.释放资源mediaRecorder.release();mediaRecorder = null;System.out.println("录制完毕,上传文件到服务器");}break;case TelephonyManager.CALL_STATE_RINGING://有人给你打电话,响铃状态break;case TelephonyManager.CALL_STATE_OFFHOOK: // 通话状态try {//开始录音//1.实例化一个录音机mediaRecorder = new MediaRecorder();//2.指定录音机的声音源 VOICE_CALL录两方的声音 MIC录自己的声音 ,模拟器支只持MIC,所以升级也一样mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); //不是MIC这个会报错//3.设置录制的文件输出的格式mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);//4.指定录音文件的名称File file = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".3gp");mediaRecorder.setOutputFile(file.getAbsolutePath());//同一种格式。avi对应多种编码格式//5.设置音频的编码mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);//6.准备开始录音mediaRecorder.prepare();//7.开始录音mediaRecorder.start();break;} catch (Exception e) {e.printStackTrace();}default:break;}}/** * 当数据变化 * */@Overridepublic void onDataActivity(int direction) {// TODO Auto-generated method stubsuper.onDataActivity(direction);}/** * 当信号变化的时候 * */@Overridepublic void onSignalStrengthsChanged(SignalStrength signalStrength) {// TODO Auto-generated method stubsuper.onSignalStrengthsChanged(signalStrength);}}}
package com.sqf.phonelistener;import java.io.File;import java.io.IOException;import android.app.Service;import android.content.Intent;import android.content.res.Configuration;import android.media.MediaRecorder;import android.os.Environment;import android.os.IBinder;import android.telephony.PhoneStateListener;import android.telephony.SignalStrength;import android.telephony.TelephonyManager;public class SystemService2 extends Service {/** * 电话管理器类 * You do not instantiate this class directly; * instead, you retrieve a reference to an instance through * Context.getSystemService(Context.TELEPHONY_SERVICE). * */private TelephonyManager tm;/** * 监听器对象 * */private MyListener listener;/** * 声明录音机 * */private MediaRecorder mediaRecorder;@Overridepublic IBinder onBind(Intent intent) {return null;}/** * 服务创建的时候调用的方法 * */@Overridepublic void onCreate() {//后台监听电话的呼叫状态//的到电话管理器的服务tm = (TelephonyManager) this.getSystemService(this.TELEPHONY_SERVICE);/* PhoneStateListener的静态变量 LISTEN_DATA_ACTIVITY 流量产生的数据 LISTEN_SIGNAL_STRENGTHS 监听信号的强弱 LISTEN_CALL_STATE 监听呼叫的状态 PhoneStateListener.LISTEN_NONE 取消监听 */listener = new MyListener();tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);//tm.getNetworkOperator(); //获取运营商的编码//tm.getNetworkOperatorName() //获取应用上的名字//tm.getNetworkType() 获取网络类型 2g,3g,4g,gprs等//tm.getPhoneType() 获取手机支持网络类型// tm.getSimSerialNumber(); 获取sim卡的序列号//tm.getLine1Number(); //获取手机的电话号码,需要支持simsuper.onCreate();} /** * 服务销毁的时候调用的方法 * */@Overridepublic void onDestroy() {super.onDestroy();//取消电话的监听tm.listen(listener, PhoneStateListener.LISTEN_NONE);//取消电话的监听Intent i = new Intent(this,SystemService.class);startService(i);listener = null;}private class MyListener extends PhoneStateListener{/** * 当电话的呼叫状态变化的时候调用的方法 * */@Overridepublic void onCallStateChanged(int state, String incomingNumber) {super.onCallStateChanged(state, incomingNumber);System.out.println("当前电话的状态:"+state);switch (state) {case TelephonyManager.CALL_STATE_IDLE: //没有打接电话,也没有接电话,空闲状态if(mediaRecorder!=null){//8.停止捕获mediaRecorder.stop();//9.释放资源mediaRecorder.release();mediaRecorder = null;System.out.println("录制完毕,上传文件到服务器");}break;case TelephonyManager.CALL_STATE_RINGING://有人给你打电话,响铃状态break;case TelephonyManager.CALL_STATE_OFFHOOK: // 通话状态try {//开始录音//1.实例化一个录音机mediaRecorder = new MediaRecorder();//2.指定录音机的声音源 VOICE_CALL录两方的声音 MIC录自己的声音 ,模拟器支只持MIC,所以升级也一样mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); //不是MIC这个会报错//3.设置录制的文件输出的格式mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);//4.指定录音文件的名称File file = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".3gp");mediaRecorder.setOutputFile(file.getAbsolutePath());//同一种格式。avi对应多种编码格式//5.设置音频的编码mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);//6.准备开始录音mediaRecorder.prepare();//7.开始录音mediaRecorder.start();break;} catch (Exception e) {e.printStackTrace();}default:break;}}/** * 当数据变化 * */@Overridepublic void onDataActivity(int direction) {super.onDataActivity(direction);}/** * 当信号变化的时候 * */@Overridepublic void onSignalStrengthsChanged(SignalStrength signalStrength) {// TODO Auto-generated method stubsuper.onSignalStrengthsChanged(signalStrength);}}}
清单文件:
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.sqf.phonelistener" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="17" /> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <!-- <span style="font-family: Arial, Helvetica, sans-serif;">电话呼叫所需要的权限</span>--><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 录音存储到内存卡的写权限 --> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name="com.sqf.phonelistener.SystemService"></service> <service android:name="com.sqf.phonelistener.SystemService2"></service> <receiver android:name="com.sqf.phonelistener.BootReveiver"> <intent-filter > <action android:name="android.intent.action.BOOT_COMPLETED"/> <!-- 广播监听手机的开机 --> </intent-filter> </receiver> </application></manifest>
方法2. 其他和方法1的类一样,方法1比较好
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:onClick="start" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="开始监听" /> <Button android:onClick="stop" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="停止监听" /></LinearLayout>
package com.sqf.phonelistener;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}/** 电话呼叫所需要的权限READ_PHONE_STATE,不加的错误 Caused by: java.lang.SecurityException: Neither user 10071 nor current process has android.permission.READ_PHONE_STATE. * */public void start(View v){//开启服务Intent intent = new Intent(this,SystemService.class);startService(intent);}public void end(View v){//停止服务Intent intent = new Intent(this,SystemService.class);stopService(intent);}}
1 0
- 电话监听器
- Android电话监听器
- android 电话状态监听器
- (Android小应用)电话监听器
- Android应用实现电话监听器
- Java电话监听器【精品博客】
- service 电话监听器并上传到服务器
- Android之Service实例电话监听器
- Android中级篇之简单的电话监听器
- 广播接收者 作用:短信监听器, 转播电话,重启监听
- 监听器
- 监听器
- 监听器
- 监听器
- 监听器
- 监听器
- 监听器
- 监听器
- word里面Ctrl+V不能粘贴解决方法
- python中‘对象’
- 从嵌套表达式谈抽象语法树(AST)到平台无关中间指令(IR)的翻译过程(线性化)
- C++第4次实验
- IOS学习 网络HTTP Get和Post请求与登录界面加密 涉及按钮边框圆角与颜色设置
- 电话监听器
- lightoj 1198 - Karate Competition 【贪心】
- IOS App常用界面结构解析,让开发更简单
- SAR成像学习(三)距离方向成像matlab代码解析 1
- 四 单例模式
- leetcode刷题8. String to Integer (atoi)
- ThreadLocal类源码解析
- java---序列六(合并流)SequenceInputStream ——对多个流进行合并
- 致自己