通过服务监控手机呼叫状态并进行录音

两个服务互相守护

<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"
    tools:context=".MainActivity" >

    <Button
        android:onClick="start"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="开始监听" />
    <Button
        android:onClick="stop"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="停止监听" />
</LinearLayout>

开启服务和停止服务

package com.itheima.phonelistener;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	public void start(View view){
		//开启服务。
		Intent intent = new Intent(this,SystemService.class);
		startService(intent);
	}

	public void stop(View view){
		//停止服务。
		Intent intent = new Intent(this,SystemService.class);
		stopService(intent);
	}

}

电话管理器 TelephonyManager,可以注册一个监听器,监听一个特定电话的状态

录音机  MediaRecorder

权限:

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />

配置服务:

<service android:name="com.itheima.phonelistener.SystemService" >
        </service>
        <service android:name="com.itheima.phonelistener.SystemService2" >
        </service>
package com.itheima.phonelistener;

import java.io.File;
import java.io.IOException;

import android.app.Service;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.Environment;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;

public class SystemService extends Service {
	// 电话管理器
	private TelephonyManager tm;
	// 监听器对象
	private MyListener listener;
	//声明录音机
	private MediaRecorder mediaRecorder;

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

	// 服务创建的时候调用的方法
	@Override
	public void onCreate() {
		// 后台监听电话的呼叫状态。

		// 得到电话管理器的引用
		tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);
		listener = new MyListener();
		//注册一个监听器,监听一个特定电话的状态
		//1监听器      2监听事件
		tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
		super.onCreate();
	}

	private class MyListener extends PhoneStateListener {

		//空闲状态是0   响铃状态是1   接通状态是2

		// 当电话的呼叫状态发生变化的时候调用的方法
		@Override
		public void onCallStateChanged(int state, String incomingNumber) {
			super.onCallStateChanged(state, incomingNumber);
			try {
				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://通话状态
					//开始录音
					//1.实例化一个录音机
					mediaRecorder = new MediaRecorder();
					//2.指定录音机的声音源      MIC是麦克风的意思,但只能录自己,VOICE_CALL是两边都能录,但是有的手机不能录
					//索尼  中兴这些国产机就能录
					//htc  欧洲  美国等andorid手机就不行,当地法律规定,录声音需要征求对方同意,所以这个参数出厂的时候就被取消掉了
					mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
					//3.设置录制的文件输出的格式
					mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);//默认的文件格式
					//4.指定录音文件的名称
					File file = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".3gp");
					mediaRecorder.setOutputFile(file.getAbsolutePath());
					//5.设置音频的编码
					mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
					//6.准备开始录音
					mediaRecorder.prepare();
					//7.开始录音
					mediaRecorder.start();
					break;
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	// 服务销毁的时候调用的方法
	@Override
	public void onDestroy() {
		super.onDestroy();

		// 取消电话的监听
		System.out.println("ondestory");
		Intent i = new Intent(this,SystemService2.class);
		startService(i);

		//LISTEN_NONE不监听,就是取消监听
		tm.listen(listener, PhoneStateListener.LISTEN_NONE);
		listener = null;

	}

}

配置广播接受者,一旦手机开机就自动启动监听服务

权限:<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

配置广播接受者:

        <receiver android:name="com.itheima.phonelistener.BootReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />  <!-- 开机启动 触发服务-->
            </intent-filter>
        </receiver>
package com.itheima.phonelistener;

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

public class BootReceiver extends BroadcastReceiver {

	//广播接收者,一旦手机开机就启动监听服务
	@Override
	public void onReceive(Context context, Intent intent) {
		Intent i = new Intent(context,SystemService.class);
		context.startService(i);
	}
}
时间: 2024-08-03 09:18:31

通过服务监控手机呼叫状态并进行录音的相关文章

zabbix用户自定义key检测内存信息和监控nginx的状态页

用户自定义key: 位置:在zabbix agent端实现: zabbix_agent.conf UserParamenter 语法格式: UserParamenter=<key>,<command> 示例: ~]# vim /etc/zabbix/zabbix_agentd.conf UserParameter=memory.free,cat /proc/meminfo | awk '/^MemFree:/{print $2}' # 没有参数时,如果要使用$,正常使用即可,如果是

zabbix监控nginx连接状态

zabbix学习笔记:zabbix监控nginx连接状态 zabbix监控nginx zabbix可以监控nginx的状态,关于一个服务的状态可以查看服务本身的状态(版本号.是否开启),还应该关注服务能力(例如以nginx的负载效果:连接数.请求数和句柄数).下面我们使用zabbix监控nginx. nginx的安装 如果想要查看nginx的服务状态,在对nginx进行源码安装的时候要选中–with-http_stub_status_module模块. 1.解压安装包: [[email prot

后端线上服务监控与报警方案

一.背景 1.上线期间服务稳定性观察较困难 一个功能上线后,其实研发心里根本没底儿,不知道这个功能上线以后是不是真的没问题:有经验一些老同学还知道直接登录线上机器去tail -f php.error.log,但是对于新同学来说,基本就只能等着被通知服务故障. 退一步说,即便是能去线上去tail -f查看错误日志,但是线上是多集群部署的,服务器都特别多,研发不可能在每一台机器上都能看到日志:即便是有日志收集机器,也得在各个集群下分别tail -f,定位问题很不方便! 再退一步说,即便是在线上机器看

二、业务服务监控

二.业务服务监控 1.文件内容差异对比方法 difflib模块实现文件内容差异对比,difflib作为python的标准库模块,无需安装,作用是对比文本之间的差异,且支持输出可读性比较强的HTML文档,与linux下的diff命令相似.我们可以使用difflib对比代码,配置文件的差别,在版本控制方面是非常有用. (1)示例:两个字符串的差异对比 通过使用difflib模块实现两个字符串的差异对比,然后以版本控制风格进行输出 [/root/text1_lines.py] #! /usr/bin/

使用zabbix监控mysql主从状态

公司mysql架构为一主多从.在日常使用过程中我们经常会遇到主从不同步的情况,为了及时处理此问题现使用zabbix监控mysql主从状态并设置触发器,如有异常则发送邮件报警. 我们都知道使用命令"show slave status \G"可以查看mysql从的状态,下面用脚本方式检查其状态. 在mysql-slave中进入zabbix-agent目录创建脚本文件. cat mysql_slave_status.sh #!/bin/bash /usr/local/mysql/bin/my

Zabbix监控(七):手动监控windows端口状态

1.监控端口的几个主要Keys: net.tcp.listen[port] Checks if this port is in LISTEN state. 0 - it is not, 1 - it is in LISTEN state. 监控TCP端口是否监听 net.tcp.port[<ip>,port] Check, if it is possible to make TCP connection to the port number. 0 - cannot connect, 1 - c

按照zabbix客户端及自定义监控nginx连接状态

一.下载客户端按照包,这里用rpm包安装 [[email protected] ~]# rpm -ivh http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-agent-3.0.4-1.el7.x86_64.rpm 修改客户端配置文件 Server=127.0.0.1 ServerActive=127.0.0.1 改为zabbix server实际的IP地址(比如zabbix server的IP地址为10.0.0.100) Server=

微服务监控案例之一

     首先,您需要了解什么是微服务架构设计,同时了解相关微服务与Docker介绍, 微服务架构的本质,是把整体的业务拆分成很多有特定明确功能的服务,通过很多分散的小服务之间的配合,去解决更大,更复杂的问题.对被拆分后的服务进行分类和管理,彼此之间使用统一的接口来进行交互.      微服务的特点决定了功能模块的部署是分布式的,以往在单应用环境下,所有的业务都在同一个服务器上,如果服务器出现错误和异常,我们只要盯住一个点,就可以快速定位和处理问题,但是在微服务的架构下,大部分功能模块都是单独部

zabbix监控nginx连接状态(转)

zabbix监控nginx zabbix可以监控nginx的状态,关于一个服务的状态可以查看服务本身的状态(版本号.是否开启),还应该关注服务能力(例如以nginx的负载效果:连接数.请求数和句柄数).下面我们使用zabbix监控nginx. nginx的安装 如果想要查看nginx的服务状态,在对nginx进行源码安装的时候要选中–with-http_stub_status_module模块. 1.解压安装包: [[email protected] mnt]# tar xvf nginx-1.