[android] 采用服务录制电话&服务的生命周期
根据上一节代码里,加入一个录音功能,上传到服务器,就能实现一个录制器
当手机处于通话状态时,开启录音机
获取MediaRecorder对象,通过new出来
调用MediaRecorder对象的setAudioSource()方法,设置音频源,
参数:MediaRecorder.AudioSource.MIC,参数是麦克风,默认只支持单向录音
调用MediaRecorder对象的setOutputFormat(),设置输出格式,
参数:MediaRecorder.OutputFormat.THREE_GPP
调用MediaRecorder对象的setAudoEncoder()方法,设置音频编码
参数:MediaRecorder.AudioEncoder.AMR_NB
调用MediaRecorder对象的setOutputFile(path)方法,设置文件保存路径
参数:”/sdcard/”+System.currentTimeMilis+”.3gp”
调用MediaRecorder对象的prepare()方法,准备
调用MediaRecorder对象的start()方法,开始
调用MediaRecorder对象的stop()方法,停止
调用MediaRecorder对象的reset()方法,重置
调用MediaRecorder对象的release()方法,释放对象
需要权限android.permission.RECORD_AUDIO
需要写文件android.permission.WRITE_EXTERNAL_STORGE
开启服务
获取Intent对象,new Intent(this,PhoneService.class),参数:上下文,字节码
调用startService(intent)方法,参数:Intent对象
关闭服务
获取Intent对象,new Intent(this,PhoneService.class),参数:上下文,字节码
调用stopService(intent)方法,参数:Intent对象
在应用管理器手工停止服务
服务放生命周期
onCreate() ==> onStartCommand() ==> onStart() ==> onDestory()
服务只会被执行一次,如果多次调用,会从onStartCommand()开始运行
MainActivity.java(主界面)
package com.tsh.listentel; 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 { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); } // 开启服务
public void start(View v) {
Intent intent = new Intent(this, PhoneService.class);
startService(intent);
} // 关闭服务
public void stop(View v) {
Intent intent = new Intent(this, PhoneService.class);
stopService(intent);
}
}
PhoneService.java(监听服务)
package com.tsh.listentel; import java.io.IOException; import android.app.Service;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager; public class PhoneService extends Service { @Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
} // 服务创建
@Override
public void onCreate() {
super.onCreate();
System.out.println("服务创建");
TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); tm.listen(new MyPhoneStateListener(),
PhoneStateListener.LISTEN_CALL_STATE);
} // 内部类
private class MyPhoneStateListener extends PhoneStateListener {
private MediaRecorder recorder; @Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber); try {
switch (state) {
case TelephonyManager.CALL_STATE_IDLE:
System.out.println("空闲状态");
//关闭
if (recorder != null) {
recorder.stop();
recorder.reset();
recorder.release();
} break;
case TelephonyManager.CALL_STATE_RINGING:
System.out.println("响铃状态");
//准备
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile("/sdcard/"
+ System.currentTimeMillis() + ".3gp");
recorder.prepare();
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
System.out.println("通话状态");
//开录
if (recorder != null) {
recorder.start();
}
break;
default:
break;
}
} catch (Exception e) {
e.printStackTrace();
}
} } // 服务销毁
@Override
public void onDestroy() {
System.out.println("服务销毁");
super.onDestroy();
} }
[android] 采用服务录制电话&服务的生命周期的更多相关文章
- 17.(转) Android之四大基本组件介绍与生命周期
Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器. 一:了解四大基本组件 Activity ...
- android拾遗——四大基本组件介绍与生命周期
Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器. 一:了解四大基本组件 Activity ...
- Android中startService的使用及Service生命周期
Android中有两种主要方式使用Service,通过调用Context的startService方法或调用Context的bindService方法.本文仅仅探讨纯startService的使用.不 ...
- Android SDK上手指南:Activity与生命周期
Android SDK上手指南:Activity与生命周期 2013-12-26 15:26 核子可乐译 51CTO 字号:T | T Activity生命周期并不仅仅在用户运行应用程序之后才开始生效 ...
- Android 中Activity生命周期分析:Android中横竖屏切换时的生命周期过程
最近在面试Android,今天出了一个这样的题目,即如题: 我当时以为生命周期是这样的: onCreate --> onStart -- ---> onResume ---> onP ...
- java线程基础巩固---Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期
Interrupt学习: 在jdk中关于interrupt相关方法有三个,如下: 关于上面的疑问会在稍后进行阐述滴,下面看代码: 编译运行: 应该说是t线程为啥在被打断之后没有退出,还是在运行状态,这 ...
- Android编程: MVC模式、应用的生命周期
学习内容:Android的应用剖析.MVC模式.应用的生命周期 ====Android的应用剖析==== 一个Android应用程序会使用如下组件: Android Activities 界面 A ...
- Android应用常规开发技巧——善用组件生命周期
数据管理 对于仅仅读数据.一种经常使用的管理模式是在onCreate函数中进行数据的载入,直到组件的onDestory函数被调用时在进行释放. // 缓存仅仅读的数据 private Object r ...
- Android开发之Activity横竖屏切换生命周期重建问题
当进行横竖屏切换的时候Activity的生命周期会重建,从而导致Activity崩溃等问题,为了避免这一问题,需要在AndroidManifest.xml文件中设置: <activity and ...
随机推荐
- Self referencing loop detected for property 错误
EF 序列化返回json时 报错:Self referencing loop detected for property 解决方案:在webapiconfig.cs文件中,增加设置: 1.config ...
- 《Tornado介绍》—— 读后总结
- Javascript高级编程学习笔记(59)—— 事件(3)事件对象
事件对象 在触发DOM‘事件时,会产生一个事件对象 event 该对象包含着所有与事件有关的信息 所有浏览器都支持 event 对象但是支持的方式有所不同 DOM事件对象 兼容DOM的浏览器会将eve ...
- 深入分析Java I/O的工作机制 (二)
2.磁盘I/C工作机制 2.1几种访问文件的方式 内核空间和用户空间:内核空间是内核使用,用户空间是应用程序使用:除非编译内核要考虑内核空间,其余情况都可以按照用户空间处理.将用户空间和内核空间置于这 ...
- numpy创建矩阵常用方法
numpy创建矩阵常用方法 arange+reshape in: n = np.arange(0, 30, 2)# start at 0 count up by 2, stop before 30 n ...
- 机器学习入门05 - 泛化 (Generalization)
原文链接:https://developers.google.com/machine-learning/crash-course/generalization 泛化是指模型很好地拟合以前未见过的新数据 ...
- c# 导入导出excel方法封装
在很多项目中,都会使用到文件的上传下载等,为了方便,封装了一个帮助类,每次直接拿过来使用就可以了,下面是封装的类和使用方法. using Common.AttributeHelper; using N ...
- mysql 架构篇系列 3 复制运行状态监控与选项参数说明
一. 概述 在上一篇中,搭建了一主一从的复制架构,这篇通过一些诊断方法来了解复制的运行状态和一些选项参数说明.上次mysql主从服务关机,今天在打开mysql服务,出现了错误信息. 1.首先 启动主从 ...
- Linux编程 22 shell编程(输出和输入重定向,管道,数学运算命令,退出脚本状态码)
1. 输出重定向 最基本的重定向是将命令的输出发送到一个文件中.在bash shell中用大于号(>) ,格式如下:command > inputfile.例如:将date命令的输出内容, ...
- 新装mysql数据库登陆不上去(账号密码正确)
Open & Edit /etc/my.cnf Add skip-grant-tables under [mysqld] Restart Mysql You should be able to ...