Android实训案例七四大组件之一Service初步了解实现通话录音功能抽调接口.docx

上传人:b****6 文档编号:8111297 上传时间:2023-01-28 格式:DOCX 页数:18 大小:155.53KB
下载 相关 举报
Android实训案例七四大组件之一Service初步了解实现通话录音功能抽调接口.docx_第1页
第1页 / 共18页
Android实训案例七四大组件之一Service初步了解实现通话录音功能抽调接口.docx_第2页
第2页 / 共18页
Android实训案例七四大组件之一Service初步了解实现通话录音功能抽调接口.docx_第3页
第3页 / 共18页
Android实训案例七四大组件之一Service初步了解实现通话录音功能抽调接口.docx_第4页
第4页 / 共18页
Android实训案例七四大组件之一Service初步了解实现通话录音功能抽调接口.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

Android实训案例七四大组件之一Service初步了解实现通话录音功能抽调接口.docx

《Android实训案例七四大组件之一Service初步了解实现通话录音功能抽调接口.docx》由会员分享,可在线阅读,更多相关《Android实训案例七四大组件之一Service初步了解实现通话录音功能抽调接口.docx(18页珍藏版)》请在冰豆网上搜索。

Android实训案例七四大组件之一Service初步了解实现通话录音功能抽调接口.docx

Android实训案例七四大组件之一Service初步了解实现通话录音功能抽调接口

Android实训案例(七)——四大组件之一Service初步了解,实现通话录音功能,抽调接口

1.启动服务

服务是怎么启动的,我们先定义一个按钮吧

android:

id="@+id/startservice"

android:

layout_width="wrap_content"

android:

layout_height="wrap_content"

android:

layout_centerInParent="true"

android:

text="启动服务"/>

我们还得新建一个类——MyService

packagecom.lgl.servicedemo;

importandroid.app.Service;

importandroid.content.Intent;

importandroid.os.IBinder;

importandroid.util.Log;

/**

*我的服务

*Createdbylglon16/4/10.

*/

publicclassMyServiceextendsService{

@Override

publicIBinderonBind(Intentintent){

returnnull;

}

}

记得要注册哦

name=".MyService"/>

好了,我们现在来看看怎么启动,其实跟activity一模一样

caseR.id.startservice:

Intenti=newIntent(this,MyService.class);

//启动服务

startService(i);

break;

我们启动之后就可以在后台看到

这里我们可以看到有一个服务

2.停止服务

停止服务就相对来讲很简单了,首先我们定义一个Button

android:

id="@+id/stopservice"

android:

layout_width="wrap_content"

android:

layout_height="wrap_content"

android:

text="停止服务"/>

然后就可以手动停止了

caseR.id.stopservice:

Intentintent=newIntent(this,MyService.class);

//停止服务

stopService(intent);

break;

这样就停止了

3.声明周期

用一张图表示,毕竟天天看Activity的生命周期,这个看懂不是难事

@Override

publicintonStartCommand(Intentintent,intflags,intstartId){

returnsuper.onStartCommand(intent,flags,startId);

}

@Override

publicvoidonCreate(){

super.onCreate();

}

@Override

publicvoidonDestroy(){

super.onDestroy();

}

这里不多做介绍

4.通话录音机

我们来写个小案例,就是用service监听通话,录音之后保存下来,我們在button中启动这个service,然后在service中一创建,我们就获取电话状态

@Override

publicvoidonCreate(){

super.onCreate();

getService();

}

publicvoidgetService(){

//服务一创建就监听

TelephonyManagertm=(TelephonyManager)getSystemService(TELEPHONY_SERVICE);

tm.listen(newmyListener(),PhoneStateListener.LISTEN_CALL_STATE);

}

classmyListenerextendsPhoneStateListener{

//电话状态改变的回调

@Override

publicvoidonCallStateChanged(intstate,StringincomingNumber){

super.onCallStateChanged(state,incomingNumber);

//判断当前的状态

switch(state){

//电话空闲

caseTelephonyManager.CALL_STATE_IDLE:

Log.i("myListener","电话空闲");

break;

//电话响铃

caseTelephonyManager.CALL_STATE_RINGING:

Log.i("myListener","电话响铃");

break;

//正在通话

caseTelephonyManager.CALL_STATE_OFFHOOK:

Log.i("myListener","电话通话");

break;

}

}

}

这里隐私授权,需要权限哦

name="android.permission.READ_PHONE_STATE"/>

那我们先来调试一下,我们点击启动服务

现在我们可以在响铃就开始准备录音资源了

//电话响铃

caseTelephonyManager.CALL_STATE_RINGING:

Log.i("myListener","电话响铃");

//判断硬件是否支持录音

if(recorder==null){

getRecorder();

}

break;

录音方法

/**

*通话录音

*/

privatevoidgetRecorder(){

recorder=newMediaRecorder();

//麦克风

recorder.setAudioSource(MediaRecorder.AudioSource.MIC);

//设置格式3GP

recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

//设置保存目录权限

recorder.setOutputFile("sdcard/audio.3gp");

//设置音频编码

recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

try{

//准备录音

recorder.prepare();

}catch(IOExceptione){

e.printStackTrace();

}

}

这里准备好了之后,我们只要接通了就开始录音

//正在通话

caseTelephonyManager.CALL_STATE_OFFHOOK:

Log.i("myListener","电话通话");

if(recorder!

=null){

//开始录音

recorder.start();

}

break;

当我们挂断电话,电话状态重新回到空闲的时候就停止并且释放资源

//电话空闲

caseTelephonyManager.CALL_STATE_IDLE:

Log.i("myListener","电话空闲");

if(recorder!

=null){

//停止录音

recorder.stop();

//释放资源

recorder.release();

recorder=null;

}

break;

我们来测试一下,我们拨打一个电话,状态是这样的

我们去目录下翻一翻

这里,可以看到有一个audio.3gp说明我们录音成功了

完整代码

MyService

packagecom.lgl.servicedemo;

importandroid.app.Service;

importandroid.content.Intent;

importandroid.media.MediaRecorder;

importandroid.os.IBinder;

importandroid.telephony.PhoneStateListener;

importandroid.telephony.TelephonyManager;

importandroid.util.Log;

importjava.io.IOException;

/**

*电话录音

*Createdbylglon16/4/10.

*/

publicclassMyServiceextendsService{

//录音

privateMediaRecorderrecorder;

@Override

publicIBinderonBind(Intentintent){

returnnull;

}

@Override

publicintonStartCommand(Intentintent,intflags,intstartId){

returnsuper.onStartCommand(intent,flags,startId);

}

@Override

publicvoidonCreate(){

super.onCreate();

getService();

}

/**

*获取电话状态

*/

publicvoidgetService(){

//服务一创建就监听

TelephonyManagertm=(TelephonyManager)getSystemService(TELEPHONY_SERVICE);

tm.listen(newmyListener(),PhoneStateListener.LISTEN_CALL_STATE);

}

classmyListenerextendsPhoneStateListener{

//电话状态改变的回调

@Override

publicvoidonCallStateChanged(intstate,StringincomingNumber){

super.onCallStateChanged(state,incomingNumber);

//判断当前的状态

switch(state){

//电话空闲

caseTelephonyManager.CALL_STATE_IDLE:

Log.i("myListener","电话空闲");

if(recorder!

=null){

//停止录音

recorder.stop();

//释放资源

recorder.release();

recorder=null;

}

break;

//电话响铃

caseTelephonyManager.CALL_STATE_RINGING:

Log.i("myListener","电话响铃");

//判断硬件是否支持录音

if(recorder==null){

getRecorder();

}

break;

//正在通话

caseTelephonyManager.CALL_STATE_OFFHOOK:

Log.i("myListener","电话通话");

if(recorder!

=null){

//开始录音

recorder.start();

}

break;

}

}

}

/**

*通话录音

*/

privatevoidgetRecorder(){

recorder=newMediaRecorder();

//麦克风

recorder.setAudioSource(MediaRecorder.AudioSource.MIC);

//设置格式3GP

recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

//设置保存目录权限

recorder.setOutputFile("sdcard/audio.3gp");

//设置音频编码

recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

try{

//准备录音

recorder.prepare();

}catch(IOExceptione){

e.printStackTrace();

}

}

@Override

publicvoidonDestroy(){

super.onDestroy();

}

}

5.Service的两种启动方式

servic启动有两种方式,我们来比对一下。

我们写一个新建一个项目ServiceTwo

activity_main.xml

xmlversion="1.0"encoding="utf-8"?

>

android="

xmlns:

tools="

android:

layout_width="match_parent"

android:

layout_height="match_parent"

android:

gravity="center"

android:

orientation="vertical">

android:

id="@+id/btn_start"

android:

text="启动服务"

android:

layout_width="wrap_content"

android:

layout_height="wrap_content"/>

android:

id="@+id/btn_stop"

android:

text="停止服务"

android:

layout_width="wrap_content"

android:

layout_height="wrap_content"/>

android:

id="@+id/btn_bind"

android:

text="绑定服务"

android:

layout_width="wrap_content"

android:

layout_height="wrap_content"/>

android:

id="@+id/btn_unbind"

android:

text="解除绑定"

android:

layout_width="wrap_content"

android:

layout_height="wrap_content"/>

MainActivity

packagecom.lgl.servicetwo;

importandroid.content.ComponentName;

importandroid.content.Intent;

importandroid.content.ServiceConnection;

importandroid.os.IBinder;

importandroid.support.v7.app.AppCompatActivity;

importandroid.os.Bundle;

importandroid.view.View;

importandroid.widget.Button;

publicclassMainActivityextendsAppCompatActivityimplementsView.OnClickListener{

privateButtonbtn_start,btn_stop,btn_bind,btn_unbind;

privateMyConnnn;

@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initView();

conn=newMyConn();

}

privatevoidinitView(){

btn_start=(Button)findViewById(R.id.btn_start);

btn_stop=(Button)findViewById(R.id.btn_stop);

btn_bind=(Button)findViewById(R.id.btn_bind);

btn_unbind=(Button)findViewById(R.id.btn_unbind);

btn_start.setOnClickListener(this);

btn_stop.setOnClickListener(this);

btn_bind.setOnClickListener(this);

btn_unbind.setOnClickListener(this);

}

@Override

publicvoidonClick(Viewv){

switch(v.getId()){

caseR.id.btn_start:

startService(newIntent(this,OneService.class));

break;

caseR.id.btn_stop:

stopService(newIntent(this,OneService.class));

break;

caseR.id.btn_bind:

bindService(newIntent(this,OneService.class),conn,BIND_AUTO_CREATE);

break;

caseR.id.btn_unbind:

unbindService(conn);

break;

}

}

/**

*服务回调

*/

classMyConnimplementsServiceConnection{

//到服务的连接被建立了

@Override

publicvoidonServiceConnected(ComponentNamename,IBinderservice){

}

//到服务的连接中断了

@Override

publicvoidonServiceDisconnected(ComponentNamename){

}

}

}

关于服务里面

OneService

packagecom.lgl.servicetwo;

importandroid.app.Service;

importandroid.content.Intent;

importandroid.os.IBinder;

/**

*Createdbylglon16/4/10.

*/

publicclassOneServiceextendsService{

//绑定

@Override

publicIBinderonBind(Intentintent){

returnnull;

}

//解绑

@Override

publicbooleanonUnbind(Intentintent){

returnsuper.onUnbind(intent);

}

//创建

@Override

publicvoidonCreate(){

super.onCreate();

}

//开始

@Override

publicintonStartCommand(Intentintent,intflags,intstartId){

returnsuper.onStartCommand(intent,flags,startId);

}

//销毁

@Override

publicvoidonDestroy(){

super.onDestroy();

}

}

这里就不赘述了,启动的对应方法,我们通过上面的分析出区别来

startService:

通过startService启动的服务,该服务所在的进程会变成服务进程

bindSevice:

进程优先级不变,但是绑定的服务和activity同生共死

6.调用service的方法

你会发现,如果单纯的看startsevice和bindservice,其实区别不大,其实,bindservice有一个用处就是可以调用service的方法,本身来看的话,你是无法吊桶service的方法的,因为你服务是启动起来的,你不能new,所以这里就要用上bindservice了,我们新建一个TwoService,并且写一个方法

//服务方法

publicvoidisShow(){

System.out.print("我是服务里的一个方法");

}

这个button启动

android:

id="@+id/btn_isshow"

android:

text="调用方法"

android:

layout_width="wrap_content"

android:

layout_height="wrap_content"/>

TwoService

packagecom.lgl.servicetwo;

importandroid.app.Service;

importandroid.content.Intent;

importandroid.os.Binder;

importandroid.os.IBinder;

/**

*Createdbylglon16/4/10.

*/

publicclassTwoServiceexten

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1