Service实例应用之电话录音

本文探讨了Android中的Service组件,讲解了Service的生命周期,并通过电话录音的示例详细阐述了如何使用Service进行后台操作。文章指出Service可以用于处理耗时任务,如下载、媒体播放等。电话录音功能的实现涉及权限声明,录音文件存储在/recorded_calls/目录下,注意长时间录音可能引发SD卡空间不足的问题。提供了源码下载链接。
摘要由CSDN通过智能技术生成

我们知道,Android有四大组件,分别是Activity,Content Provider , Broadcast Receiver 和今天我们要用到的Service。

我们说Service是看不见摸不着的,是因为它对用户是不可见的,Service作为四大组件之一,它的职责是工作在后台,处理

一些比较耗时的操作(如下载,播放媒体文件,检测版本更新和日志输出等)。

就像学习Activity组件一样,要想熟悉Service,必须知道它的整个工作流程,即它的生命周期(Life-cycle),下面是官网给

出的一个具体图例:



从图例我们可以知道,Service有两种启动方式,第一种是调用Context.startService()方法,

另外一种是调用Context.bindService().

对于第一种调用方法,系统会先调用onCreate()方法,负责初始化工作,然后调用onStart()方法,

启动Service,如果程序显示调用Context.stopService()方法或者Service自身调用stopSelf()方法

或者stopSelfResult()方法,都会调用onDestroy()方法,结束该服务,另外需要注意的是,调用者

和Service是没有关联的,也就是说,如果调用者退出了,并不会影响服务的运行。

对于第二种方式,调用方法是Context.bindService(),系统会先调用onCreate()方法,然后调用onBind()

方法,和调用者绑定,如果调用者退出,服务会调用onDestroy()方法结束自己的运行。


学完了一个东西,如果趁热打铁,自己编写一个demo,肯定会加深对该知识点的理解。

废话少说,下面给出一个电话录音的例子:


首先,也是最重要的,关于权限的声明:

    <!-- 电话状态监听权限 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <!-- 开机广播权限 -->
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <!-- 音频刻录权限 -->
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <!-- 写入权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

接下来是编写一个简单的Activity,用来启动Broadcast Receiver组件。


package com.example.service_record_call;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        Intent receiver = new Intent("zjut.tsw.receiver");
        this.sendBroadcast(receiver);
    }

    
}

然后是编写一个简单的Broadcast Receiver,负责启动Service


package com.example.service_record_call;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class MyBroadcastReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		Intent service = new Intent(context,PhoneListenerService.class);
		context.startService(service);
	}

}

接下来是编写核心Service.


package com.example.service_record_call;

import java.io.File;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.Environment;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;

public class PhoneListenerService extends Service {

	
	private final String TAG = "PhoneListenerService";
	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}
	
	@Override
	public void onCreate() {
		TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
		telephonyManager.listen(new TeleListine(), PhoneStateListener.LISTEN_CALL_STATE);
		Log.i(TAG,"onCreate");
		super.onCreate();
	}
	
	private class TeleListine extends PhoneStateListener {
		
		private String mobile; //来电电话
		private MediaRecorder recorder; //多媒体刻录文件
		private File autoFile; //保存文件
		private boolean recoder; //是否刻录
		
		@Override
		public void onCallStateChanged(int state,String incomingNumber) {
			try{
				switch(state) {
				case TelephonyManager.CALL_STATE_IDLE :
					
					if(recoder) {
						recorder.stop();
						recorder.release();
						recoder = false;
					}
					break;
					
				case TelephonyManager.CALL_STATE_OFFHOOK :
					recorder = new MediaRecorder();
					recorder.setAudioSource(MediaRecorder.AudioSource.MIC);					//这里只是录制自己的声音,如果想录制双方的通话声音,可改用MediaRecorder.AudioSource.VOICE_CALL
					recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
					recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
					String root_directory = Environment.getExternalStorageDirectory() + "/recorded_calls";
					File root_file = new File(root_directory);
					if(!root_file.exists()) {
						root_file.mkdir();
					}
					String record_call = root_directory + "/" + mobile + "_" + System.currentTimeMillis() + ".3gp";
					File autoFile = new File(record_call);
					if(!autoFile.exists()) {
						autoFile.createNewFile();
					}
					//autoFile = new File(getCacheDir(),mobile+ "_" + System.currentTimeMillis() + ".3gp");
					recorder.setOutputFile(autoFile.getAbsolutePath());
					recorder.prepare();
					recorder.start();
					recoder = true;
					Log.i(TAG,"接起电话");
					break;
					
				case TelephonyManager.CALL_STATE_RINGING :
					mobile = incomingNumber;
					Log.i(TAG,"mobile=" + mobile);
					break;
				default :
					break;
				}
			}catch(Exception e) {
				Log.i(TAG,e.toString());
				e.printStackTrace();
			}
			super.onCallStateChanged(state, incomingNumber);
		}
		
		
	}

}

别忘了在AndroidManifest.xml中注册组件Service和Broadcast Receiver


        <receiver android:name=".MyBroadcastReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="zjut.tsw.receiver" />
            </intent-filter>
        </receiver>

        <service android:name=".PhoneListenerService" >
        </service>

这样,当您打开了该软件,或者开机后,该服务会自动启动并运行(你可以在Android机上按Menu键->设置->应用程序->运行的服务 查看该服务的具体状态)

当有人打电话给你或者你打给别人,电话录音会保存在/recorded_calls/...里面。(该程序含有潜在的错误,如果通话时间足够多或足够长(煲电话粥的同志们注意了哦),可能会导致SD卡内存不足)


有需要源码的请Click:http://download.csdn.net/detail/czjuttsw/4700525


Over...





评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值