android服務(service)初步——通話錄音

啓動服務之後,監聽手機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>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章