1、Android实训案例七四大组件之一Service初步了解实现通话录音功能抽调接口Android实训案例(七)四大组件之一Service初步了解,实现通话录音功能,抽调接口1.启动服务服务是怎么启动的,我们先定义一个按钮吧 我们还得新建一个类MyServicepackage com.lgl.servicedemo;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.util.Log;/* * 我的服务 * Created by lgl on 16/4/
2、10. */public class MyService extends Service Override public IBinder onBind(Intent intent) return null; 记得要注册哦 好了,我们现在来看看怎么启动,其实跟activity一模一样case R.id.startservice: Intent i = new Intent(this, MyService.class); /启动服务 startService(i); break;我们启动之后就可以在后台看到这里我们可以看到有一个服务2.停止服务停止服务就相对来讲很简单了,首先我们定义一个Butto
3、n 然后就可以手动停止了 case R.id.stopservice: Intent intent = new Intent(this, MyService.class); /停止服务 stopService(intent); break;这样就停止了3.声明周期用一张图表示,毕竟天天看Activity的生命周期,这个看懂不是难事 Override public int onStartCommand(Intent intent, int flags, int startId) return super.onStartCommand(intent, flags, startId); Overri
4、de public void onCreate() super.onCreate(); Override public void onDestroy() super.onDestroy(); 这里不多做介绍4.通话录音机我们来写个小案例,就是用service监听通话,录音之后保存下来,我們在button中启动这个service,然后在service中一创建,我们就获取电话状态Override public void onCreate() super.onCreate(); getService(); public void getService() /服务一创建就监听 TelephonyMan
5、ager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); tm.listen(new myListener(), PhoneStateListener.LISTEN_CALL_STATE); class myListener extends PhoneStateListener /电话状态改变的回调 Override public void onCallStateChanged(int state, String incomingNumber) super.onCallStateChanged(state, incomi
6、ngNumber); /判断当前的状态 switch (state) /电话空闲 case TelephonyManager.CALL_STATE_IDLE: Log.i(myListener, 电话空闲); break; /电话响铃 case TelephonyManager.CALL_STATE_RINGING: Log.i(myListener, 电话响铃); break; /正在通话 case TelephonyManager.CALL_STATE_OFFHOOK: Log.i(myListener, 电话通话); break; 这里隐私授权,需要权限哦那我们先来调试一下,我们点击启动
7、服务现在我们可以在响铃就开始准备录音资源了 /电话响铃 case TelephonyManager.CALL_STATE_RINGING: Log.i(myListener, 电话响铃); /判断硬件是否支持录音 if (recorder = null) getRecorder(); break;录音方法 /* * 通话录音 */ private void getRecorder() recorder = new MediaRecorder(); /麦克风 recorder.setAudioSource(MediaRecorder.AudioSource.MIC); /设置格式 3GP rec
8、order.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); /设置保存目录 权限 recorder.setOutputFile(sdcard/audio.3gp); /设置音频编码 recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); try /准备录音 recorder.prepare(); catch (IOException e) e.printStackTrace(); 这里准备好了之后,我们只要接通了就开始录音 /正在通话 case TelephonyMa
9、nager.CALL_STATE_OFFHOOK: Log.i(myListener, 电话通话); if(recorder != null) /开始录音 recorder.start(); break;当我们挂断电话,电话状态重新回到空闲的时候就停止并且释放资源 /电话空闲 case TelephonyManager.CALL_STATE_IDLE: Log.i(myListener, 电话空闲); if(recorder != null) /停止录音 recorder.stop(); /释放资源 recorder.release(); recorder = null; break;我们来测
10、试一下,我们拨打一个电话,状态是这样的我们去目录下翻一翻这里,可以看到有一个audio.3gp说明我们录音成功了完整代码MyServicepackage com.lgl.servicedemo;import android.app.Service;import android.content.Intent;import android.media.MediaRecorder;import android.os.IBinder;import android.telephony.PhoneStateListener;import android.telephony.TelephonyManager
11、;import android.util.Log;import java.io.IOException;/* * 电话录音 * Created by lgl on 16/4/10. */public class MyService extends Service /录音 private MediaRecorder recorder; Override public IBinder onBind(Intent intent) return null; Override public int onStartCommand(Intent intent, int flags, int startId)
12、 return super.onStartCommand(intent, flags, startId); Override public void onCreate() super.onCreate(); getService(); /* * 获取电话状态 */ public void getService() /服务一创建就监听 TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); tm.listen(new myListener(), PhoneStateListener.LISTEN_
13、CALL_STATE); class myListener extends PhoneStateListener /电话状态改变的回调 Override public void onCallStateChanged(int state, String incomingNumber) super.onCallStateChanged(state, incomingNumber); /判断当前的状态 switch (state) /电话空闲 case TelephonyManager.CALL_STATE_IDLE: Log.i(myListener, 电话空闲); if(recorder !=
14、null) /停止录音 recorder.stop(); /释放资源 recorder.release(); recorder = null; break; /电话响铃 case TelephonyManager.CALL_STATE_RINGING: Log.i(myListener, 电话响铃); /判断硬件是否支持录音 if (recorder = null) getRecorder(); break; /正在通话 case TelephonyManager.CALL_STATE_OFFHOOK: Log.i(myListener, 电话通话); if(recorder != null)
15、 /开始录音 recorder.start(); break; /* * 通话录音 */ private void getRecorder() recorder = new MediaRecorder(); /麦克风 recorder.setAudioSource(MediaRecorder.AudioSource.MIC); /设置格式 3GP recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); /设置保存目录 权限 recorder.setOutputFile(sdcard/audio.3gp); /设置音频编码
16、recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); try /准备录音 recorder.prepare(); catch (IOException e) e.printStackTrace(); Override public void onDestroy() super.onDestroy(); 5.Service的两种启动方式servic启动有两种方式,我们来比对一下。我们写一个新建一个项目ServiceTwoactivity_main.xml MainActivitypackage com.lgl.servicetw
17、o;import android.content.ComponentName;import android.content.Intent;import android.content.ServiceConnection;import android.os.IBinder;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;public class MainActivity extends App
18、CompatActivity implements View.OnClickListener private Button btn_start, btn_stop, btn_bind, btn_unbind; private MyConn nn; Override protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); conn = new MyConn(); private
19、 void initView() 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.s
20、etOnClickListener(this); btn_unbind.setOnClickListener(this); Override public void onClick(View v) switch (v.getId() case R.id.btn_start: startService(new Intent(this,OneService.class); break; case R.id.btn_stop: stopService(new Intent(this,OneService.class); break; case R.id.btn_bind: bindService(n
21、ew Intent(this,OneService.class),conn,BIND_AUTO_CREATE); break; case R.id.btn_unbind: unbindService(conn); break; /* * 服务回调 */ class MyConn implements ServiceConnection /到服务的连接被建立了 Override public void onServiceConnected(ComponentName name, IBinder service) /到服务的连接中断了 Override public void onServiceD
22、isconnected(ComponentName name) 关于服务里面OneServicepackage com.lgl.servicetwo;import android.app.Service;import android.content.Intent;import android.os.IBinder;/* * Created by lgl on 16/4/10. */public class OneService extends Service /绑定 Override public IBinder onBind(Intent intent) return null; /解绑 O
23、verride public boolean onUnbind(Intent intent) return super.onUnbind(intent); /创建 Override public void onCreate() super.onCreate(); /开始 Override public int onStartCommand(Intent intent, int flags, int startId) return super.onStartCommand(intent, flags, startId); /销毁 Override public void onDestroy()
24、super.onDestroy(); 这里就不赘述了,启动的对应方法,我们通过上面的分析出区别来startService:通过startService启动的服务,该服务所在的进程会变成服务进程bindSevice:进程优先级不变,但是绑定的服务和activity同生共死6.调用service的方法你会发现,如果单纯的看startsevice和bindservice,其实区别不大,其实,bindservice有一个用处就是可以调用service的方法,本身来看的话,你是无法吊桶service的方法的,因为你服务是启动起来的,你不能new,所以这里就要用上bindservice了,我们新建一个TwoService,并且写一个方法 /服务方法 public void isShow() System.out.print(我是服务里的一个方法); 这个button启动 TwoServicepackage com.lgl.servicetwo;import android.app.Service;import android.content.Intent;import android.os.Binder;import android.os.IBinder;/* * Created by lgl on 16/4/10. */public class TwoService exten
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1