Android初级教程实现电话录音

需求:设置来电后自动录音。

首先设置一个按钮,代码很简单这里就不再给出。

建一个类,RecorderServicer extends Service

package com.ydl.recorder;

import java.io.IOException;

import android.app.Service;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.IBinder;
import android.telecom.TelecomManager;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;

public class RecorderServicer extends Service {

	private MediaRecorder recorder;

	@Override
	public IBinder onBind(Intent intent) {

		return null;
	}

	@Override
	public void onCreate() {
		super.onCreate();
		TelephonyManager 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) {
			// TODO Auto-generated method stub
			super.onCallStateChanged(state, incomingNumber);

			switch (state) {
			case TelephonyManager.CALL_STATE_IDLE:
				System.out.println("空闲");
				if (recorder != null) {
					recorder.stop();// 停止录音
					recorder.release();
					recorder = null;
				}

				break;
			case TelephonyManager.CALL_STATE_RINGING:
				System.out.println("响铃");
				// 进行初始化
				if (recorder != null) {
					recorder = new MediaRecorder();
					recorder.setAudioSource(MediaRecorder.AudioSource.MIC);// Microphone
																			// audio
																			// source
					recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);// 设置输出3gp格式
					recorder.setOutputFile("sdcard/luyin.3gp");
					recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);// 设置音频编码格式
					try {
						recorder.prepare();// 做好准备
					} catch (Exception e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}

				break;
			case TelephonyManager.CALL_STATE_OFFHOOK:
				System.out.println("摘机");

				// 开始录音
				if (recorder != null) {
					recorder.start();
				}
			default:
				break;
			}
		}
	}

}

在主活动界面设置按钮点击事件:用于启动上述服务

package com.ydl.recorder;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
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 click(View v){
    	Intent intent = new Intent(this, RecorderServicer.class);
    	startService(intent);
    	
    }
}
为了做的更逼真一些,设置开机启动服务:因此用到了上一章的开机广播机制

新建一个类:BootReceiver extends BroadcastReceiver   用于开机启动服务。因为服务是在后台的,不可见面,因此不必设置任务栈即不需要addFlags()方法

package com.ydl.recorder;

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

public class BootReceiver extends BroadcastReceiver {
	
	//设置开机启动服务

	@Override
	public void onReceive(Context context, Intent intent) {
		Intent it = new Intent(context, RecorderServicer.class);
		context.startService(it);

	}

}

上述代码都是对系统进行操作,例如:监听电话状态、设置开机广播、写出数据到SDcard、设置录音方式。因此需要配置权限,同时上边的而广播和服务都要进行相应的配置。

清单文件的权限和服务广播注册如下:

 <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
 
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<service android:name="com.ydl.recorder.RecorderServicer"></service>
        <receiver android:name="com.ydl.recorder.BootReceiver">
            <intent-filter >
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>


你可能感兴趣的:(android,service)