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:

  1. package com.song;  
  2.   
  3. import Android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.util.Log;  
  7. import android.view.View;  
  8. import android.widget.Button;  
  9.   
  10. public class PhoneListenerActivity extends Activity  
  11. {  
  12.   
  13.     protected static final String ACTION = "recordingFlag";  
  14.     protected static final String TAG = "TAG";  
  15.     Button btnStart;  
  16.     Button btnStop;  
  17.   
  18.     @Override  
  19.     public void onCreate(Bundle savedInstanceState)  
  20.     {  
  21.         super.onCreate(savedInstanceState);  
  22.         setContentView(R.layout.main);  
  23.   
  24.         btnStart = (Button) findViewById(R.id.btnstart);  
  25.         btnStop = (Button) findViewById(R.id.btnstop);  
  26.   
  27.         btnStart.setOnClickListener(new Button.OnClickListener()  
  28.         {  
  29.   
  30.             @Override  
  31.             public void onClick(View v)  
  32.             {  
  33.                 Log.v(TAG, "startService");  
  34.                 startService(new Intent(ACTION));  
  35.             }  
  36.         });  
  37.   
  38.         btnStop.setOnClickListener(new Button.OnClickListener()  
  39.         {  
  40.   
  41.             @Override  
  42.             public void onClick(View v)  
  43.             {  
  44.                 Log.v(TAG, "stopService");  
  45.                 stopService(new Intent(ACTION));          
  46.             }  
  47.   
  48.         });  
  49.   
  50.     }  
  51. }  
服务类:
  1. package com.song;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import android.app.Service;  
  6. import android.content.Context;  
  7. import android.content.Intent;  
  8. import android.media.MediaRecorder;  
  9. import android.os.Environment;  
  10. import android.os.IBinder;  
  11. import android.telephony.PhoneStateListener;  
  12. import android.telephony.TelephonyManager;  
  13. import android.util.Log;  
  14.   
  15. public class PhoneListenerService extends Service  
  16. {  
  17.   
  18.     private MediaRecorder recorder;  
  19.     private boolean recording = false;  
  20.   
  21.     @Override  
  22.     public IBinder onBind(Intent intent)  
  23.     {  
  24.         return null;  
  25.     }  
  26.   
  27.     @Override  
  28.     public void onCreate()  
  29.     {  
  30.         TelephonyManager manager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);  
  31.         manager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);  
  32.         super.onCreate();  
  33.     }  
  34.   
  35.     private PhoneStateListener listener = new PhoneStateListener()  
  36.     {  
  37.   
  38.         @Override  
  39.         public void onCallStateChanged(int state, String incomingNumber)  
  40.         {  
  41.             super.onCallStateChanged(state, incomingNumber);  
  42.             switch (state)  
  43.             {  
  44.             case TelephonyManager.CALL_STATE_IDLE:// 空闲或者挂断   
  45.                 // 挂断就停止录音   
  46.                 stopRecord();  
  47.                 break;  
  48.             case TelephonyManager.CALL_STATE_RINGING:// 响铃   
  49.                 // 响铃什么都不做   
  50.                 break;  
  51.             case TelephonyManager.CALL_STATE_OFFHOOK:// 接起电话   
  52.                 // 接起电话开始录音   
  53.                 recordCalling();  
  54.                 break;  
  55.             default:  
  56.                 break;  
  57.             }  
  58.         }  
  59.     };  
  60.   
  61.     private void stopRecord()  
  62.     {  
  63.         if (recording)  
  64.         {  
  65.             Log.v("TAG""stopRecord");  
  66.             recorder.stop();  
  67.             recorder.release();// 释放资源   
  68.         }  
  69.     }  
  70.   
  71.     private void recordCalling()  
  72.     {  
  73.   
  74.         try  
  75.         {  
  76.             Log.v("TAG""recordCalling");  
  77.             recorder = new MediaRecorder();  
  78.             recorder.setAudioSource(MediaRecorder.AudioSource.MIC);  
  79.             recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);  
  80.             recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);  
  81.             recorder.setOutputFile(Environment.getExternalStorageDirectory()  
  82.                     .getAbsolutePath()+"/" + System.currentTimeMillis() + ".3gp");  
  83.             recorder.prepare();  
  84.             recorder.start();  
  85.             recording = true;  
  86.         }catch (Exception e)  
  87.         {  
  88.             e.printStackTrace();  
  89.         }  
  90.   
  91.     }  
  92. }  
配置文件:
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.       package="com.song"  
  4.       android:versionCode="1"  
  5.       android:versionName="1.0">  
  6.     <uses-sdk android:minSdkVersion="8" />  
  7.   
  8.     <application android:icon="@drawable/icon" android:label="@string/app_name">  
  9.         <activity android:name=".PhoneListenerActivity"  
  10.                   android:label="@string/app_name">  
  11.             <intent-filter>  
  12.                 <action android:name="android.intent.action.MAIN" />  
  13.                 <category android:name="android.intent.category.LAUNCHER" />  
  14.             </intent-filter>  
  15.         </activity>  
  16.   
  17.     <service android:name=".PhoneListenerService">  
  18.         <intent-filter>  
  19.             <action android:name="recordingFlag"/>  
  20.         </intent-filter>  
  21.     </service>  
  22.       
  23.     </application>  
  24.     <uses-permission android:name="android.permission.READ_PHONE_STATE"/>  
  25.     <uses-permission android:name="android.permission.RECORD_AUDIO"/>  
  26.     <!-- 向sdcard中写数据的权限 -->  
  27.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
  28. </manifest>  

相关内容