根据上一节代码里,加入一个录音功能,上传到服务器,就能实现一个录制器

当手机处于通话状态时,开启录音机

获取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] 采用服务录制电话&服务的生命周期的更多相关文章

  1. 17.(转) Android之四大基本组件介绍与生命周期

    Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器. 一:了解四大基本组件 Activity ...

  2. android拾遗——四大基本组件介绍与生命周期

    Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器. 一:了解四大基本组件 Activity ...

  3. Android中startService的使用及Service生命周期

    Android中有两种主要方式使用Service,通过调用Context的startService方法或调用Context的bindService方法.本文仅仅探讨纯startService的使用.不 ...

  4. Android SDK上手指南:Activity与生命周期

    Android SDK上手指南:Activity与生命周期 2013-12-26 15:26 核子可乐译 51CTO 字号:T | T Activity生命周期并不仅仅在用户运行应用程序之后才开始生效 ...

  5. Android 中Activity生命周期分析:Android中横竖屏切换时的生命周期过程

    最近在面试Android,今天出了一个这样的题目,即如题: 我当时以为生命周期是这样的: onCreate --> onStart -- ---> onResume ---> onP ...

  6. java线程基础巩固---Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期

    Interrupt学习: 在jdk中关于interrupt相关方法有三个,如下: 关于上面的疑问会在稍后进行阐述滴,下面看代码: 编译运行: 应该说是t线程为啥在被打断之后没有退出,还是在运行状态,这 ...

  7. Android编程: MVC模式、应用的生命周期

    学习内容:Android的应用剖析.MVC模式.应用的生命周期 ====Android的应用剖析==== 一个Android应用程序会使用如下组件: Android Activities   界面 A ...

  8. Android应用常规开发技巧——善用组件生命周期

    数据管理 对于仅仅读数据.一种经常使用的管理模式是在onCreate函数中进行数据的载入,直到组件的onDestory函数被调用时在进行释放. // 缓存仅仅读的数据 private Object r ...

  9. Android开发之Activity横竖屏切换生命周期重建问题

    当进行横竖屏切换的时候Activity的生命周期会重建,从而导致Activity崩溃等问题,为了避免这一问题,需要在AndroidManifest.xml文件中设置: <activity and ...

随机推荐

  1. Self referencing loop detected for property 错误

    EF 序列化返回json时 报错:Self referencing loop detected for property 解决方案:在webapiconfig.cs文件中,增加设置: 1.config ...

  2. 《Tornado介绍》—— 读后总结

  3. Javascript高级编程学习笔记(59)—— 事件(3)事件对象

    事件对象 在触发DOM‘事件时,会产生一个事件对象 event 该对象包含着所有与事件有关的信息 所有浏览器都支持 event 对象但是支持的方式有所不同 DOM事件对象 兼容DOM的浏览器会将eve ...

  4. 深入分析Java I/O的工作机制 (二)

    2.磁盘I/C工作机制 2.1几种访问文件的方式 内核空间和用户空间:内核空间是内核使用,用户空间是应用程序使用:除非编译内核要考虑内核空间,其余情况都可以按照用户空间处理.将用户空间和内核空间置于这 ...

  5. numpy创建矩阵常用方法

    numpy创建矩阵常用方法 arange+reshape in: n = np.arange(0, 30, 2)# start at 0 count up by 2, stop before 30 n ...

  6. 机器学习入门05 - 泛化 (Generalization)

    原文链接:https://developers.google.com/machine-learning/crash-course/generalization 泛化是指模型很好地拟合以前未见过的新数据 ...

  7. c# 导入导出excel方法封装

    在很多项目中,都会使用到文件的上传下载等,为了方便,封装了一个帮助类,每次直接拿过来使用就可以了,下面是封装的类和使用方法. using Common.AttributeHelper; using N ...

  8. mysql 架构篇系列 3 复制运行状态监控与选项参数说明

    一. 概述 在上一篇中,搭建了一主一从的复制架构,这篇通过一些诊断方法来了解复制的运行状态和一些选项参数说明.上次mysql主从服务关机,今天在打开mysql服务,出现了错误信息. 1.首先 启动主从 ...

  9. Linux编程 22 shell编程(输出和输入重定向,管道,数学运算命令,退出脚本状态码)

    1. 输出重定向 最基本的重定向是将命令的输出发送到一个文件中.在bash shell中用大于号(>) ,格式如下:command > inputfile.例如:将date命令的输出内容, ...

  10. 新装mysql数据库登陆不上去(账号密码正确)

    Open & Edit /etc/my.cnf Add skip-grant-tables under [mysqld] Restart Mysql You should be able to ...