Android实训案例(七)——四大组件之一Service初步了解,实现通话录音功能,抽调接口
2023-09-14 08:59:39 时间
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
@Override
public void onCreate() {
super.onCreate();
@Override
public void onDestroy() {
super.onDestroy();
}
//服务一创建就监听 TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); tm.listen(new myListener(), PhoneStateListener.LISTEN_CALL_STATE);
public void onCallStateChanged(int state, String incomingNumber) { super.onCallStateChanged(state, incomingNumber); //判断当前的状态 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; }
public int onStartCommand(Intent intent, int flags, int startId) { 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_CALL_STATE);
public void onCallStateChanged(int state, String incomingNumber) { super.onCallStateChanged(state, incomingNumber); //判断当前的状态 switch (state) { //电话空闲 case TelephonyManager.CALL_STATE_IDLE: Log.i("myListener", "电话空闲"); if(recorder != 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){ //开始录音 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"); //设置音频编码 recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); try { //准备录音 recorder.prepare(); } catch (IOException e) { e.printStackTrace(); @Override public void onDestroy() { super.onDestroy();
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); conn = new MyConn(); private 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.setOnClickListener(this); btn_unbind.setOnClickListener(this);
case R.id.btn_bind: bindService(new 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 onServiceDisconnected(ComponentName name) {
public int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent, flags, startId); //销毁 @Override public void onDestroy() { super.onDestroy();
我们来写个小案例,就是用service监听通话,录音之后保存下来,我們在button中启动这个service,然后在service中一创建,我们就获取电话状态
//服务一创建就监听 TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); tm.listen(new myListener(), PhoneStateListener.LISTEN_CALL_STATE);
public void onCallStateChanged(int state, String incomingNumber) { super.onCallStateChanged(state, incomingNumber); //判断当前的状态 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; }
public int onStartCommand(Intent intent, int flags, int startId) { 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_CALL_STATE);
public void onCallStateChanged(int state, String incomingNumber) { super.onCallStateChanged(state, incomingNumber); //判断当前的状态 switch (state) { //电话空闲 case TelephonyManager.CALL_STATE_IDLE: Log.i("myListener", "电话空闲"); if(recorder != 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){ //开始录音 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"); //设置音频编码 recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); try { //准备录音 recorder.prepare(); } catch (IOException e) { e.printStackTrace(); @Override public void onDestroy() { super.onDestroy();
?xml version="1.0" encoding="utf-8"? 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:gravity="center" android:orientation="vertical" Button android:id="@+id/btn_start" android:text="启动服务" android:layout_width="wrap_content" android:layout_height="wrap_content" / Button android:id="@+id/btn_stop" android:text="停止服务" android:layout_width="wrap_content" android:layout_height="wrap_content" / Button android:id="@+id/btn_bind" android:text="绑定服务" android:layout_width="wrap_content" android:layout_height="wrap_content" / Button android:id="@+id/btn_unbind" android:text="解除绑定" android:layout_width="wrap_content" android:layout_height="wrap_content" / /LinearLayout
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); conn = new MyConn(); private 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.setOnClickListener(this); btn_unbind.setOnClickListener(this);
case R.id.btn_bind: bindService(new 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 onServiceDisconnected(ComponentName name) {
public int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent, flags, startId); //销毁 @Override public void onDestroy() { super.onDestroy();
startService:通过startService启动的服务,该服务所在的进程会变成服务进程
bindSevice:进程优先级不变,但是绑定的服务和activity同生共死
6.调用service的方法你会发现,如果单纯的看startsevice和bindservice,其实区别不大,其实,bindservice有一个用处就是可以调用service的方法,本身来看的话,你是无法吊桶service的方法的,因为你服务是启动起来的,你不能new,所以这里就要用上bindservice了,我们新建一个TwoService,并且写一个方法
这里,我们实现了一个中间回传,把这个方法给传出去,然后在MainActivity中,我们首先先启动这个服务
Intent i = new Intent(this,TwoService.class); //如果需要解绑的话就不能用匿名内部类 bindService(i, new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { //就是返回的对象 onclick = (TwoService.Onclick) service; @Override public void onServiceDisconnected(ComponentName name) {
当你以为这样就结束了,那就太不给力了,这里service里有些东西是不能对外提供的,java的思想还是来源于生活,所以我们要把他抽调成接口,我们新建一个接口
相关文章
- android onresume方法,非静态方法’onResume’Android Studio
- android+制作开机动画,Android 开机动画制作详解
- 74款android开机动画,修改Android系统开机动画
- android bindservice方法,Android bindservice方法返回false
- android 的hook技术,Android Native Hook技术(一)
- android实现免费短信验证
- Android触摸事件_android设置按钮点击事件
- Android Services Library_android freeware
- android横竖屏切换问题
- Android studio更新后出现警告:Warning:The `android.dexOptions.incremental` property is deprecated and it has
- 【Android NDK 开发】Visual Studio 2019 使用 CMake 开发 JNI 动态库 ( 动态库编译配置 | JNI 头文件导入 | JNI 方法命名规范 )
- 【Android 逆向】Android 权限 ( adb 降权相关的属性 | ro.secure 属性 | ro.debuggable 属性 | service.adb.root 属性 )
- 【Android 逆向】Android 中常用的 so 动态库 ( libdvm.so | libart.so | libandroid_runtime.so | libandroidfw.so )
- Android ormLite复杂条件查询详解手机开发
- Android模拟器如何加载本机地址及访问本机服务器详解编程语言
- 微软正开发WSA子系统:Android应用可在Intel/AMD/ARM设备上运行
- Android实现PHP连接MySQL进行数据交互(android通过php连接mysql)
- 使用Android实现连接MySQL数据库:实现快速数据交互与管理(android连接mysql数据库)
- 谷歌Android Things的逆生长
- Android拨号盘支持T9搜索和号码搜索等拨号盘案例
- 将文件放到Android模拟器的SD卡中的两种解决方法
- Android关机弹出选择菜单的深入解析
- Android获取经纬度计算距离介绍
- android开发教程之framework增加字符串资源和图片等resource资源