启动服务之后,监听手机TelephonyManager状态,根据不同情况做出选择,源码以及截图如下:
生成的录音文件:
Log日志:
这个不知道为什么,点击多次停止服务的时候,总是会出现下面的BUG:
图片看不清楚,我把日志复制了出来如下:
09-21 19:56:31.850: ERROR/audio_input(34): unsupported parameter: x-pvmf/media-input-node/cap-config-interface;valtype=key_specific_value
09-21 19:56:31.850: ERROR/audio_input(34): VerifyAndSetParameter failed
知道原因的,麻烦告诉我,灰常感激。。。俺百度了好久不知道为啥。
源码:
MainActivity:
package com.song;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class PhoneListenerActivity extends Activity
{
protected static final String ACTION = "recordingFlag";
protected static final String TAG = "TAG";
Button btnStart;
Button btnStop;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnStart = (Button) findViewById(R.id.btnstart);
btnStop = (Button) findViewById(R.id.btnstop);
btnStart.setOnClickListener(new Button.OnClickListener()
{
@Override
public void onClick(View v)
{
Log.v(TAG, "startService");
startService(new Intent(ACTION));
}
});
btnStop.setOnClickListener(new Button.OnClickListener()
{
@Override
public void onClick(View v)
{
Log.v(TAG, "stopService");
stopService(new Intent(ACTION));
}
});
}
}
服务类:
package com.song;
import java.io.IOException;
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 MediaRecorder recorder;
private boolean recording = false;
@Override
public IBinder onBind(Intent intent)
{
return null;
}
@Override
public void onCreate()
{
TelephonyManager manager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
manager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
super.onCreate();
}
private PhoneStateListener listener = new PhoneStateListener()
{
@Override
public void onCallStateChanged(int state, String incomingNumber)
{
super.onCallStateChanged(state, incomingNumber);
switch (state)
{
case TelephonyManager.CALL_STATE_IDLE:// 空闲或者挂断
// 挂断就停止录音
stopRecord();
break;
case TelephonyManager.CALL_STATE_RINGING:// 响铃
// 响铃什么都不做
break;
case TelephonyManager.CALL_STATE_OFFHOOK:// 接起电话
// 接起电话开始录音
recordCalling();
break;
default:
break;
}
}
};
private void stopRecord()
{
if (recording)
{
Log.v("TAG", "stopRecord");
recorder.stop();
recorder.release();// 释放资源
}
}
private void recordCalling()
{
try
{
Log.v("TAG", "recordCalling");
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(Environment.getExternalStorageDirectory()
.getAbsolutePath()+"/" + System.currentTimeMillis() + ".3gp");
recorder.prepare();
recorder.start();
recording = true;
}catch (Exception e)
{
e.printStackTrace();
}
}
}
配置文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.song"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".PhoneListenerActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".PhoneListenerService">
<intent-filter>
<action android:name="recordingFlag"/>
</intent-filter>
</service>
</application>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<!-- 向sdcard中写数据的权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest>