android服务(service)初步——通话录音
2016-01-06 09:14
543 查看
启动服务之后,监听手机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:
[java] view
plaincopy
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));
}
});
}
}
服务类:
[java] view
plaincopy
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();
}
}
}
配置文件:
[html] view
plaincopy
<?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>
生成的录音文件:
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:
[java] view
plaincopy
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));
}
});
}
}
服务类:
[java] view
plaincopy
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();
}
}
}
配置文件:
[html] view
plaincopy
<?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>
相关文章推荐
- Android绘图机制(二)——自定义View绘制形, 圆形, 三角形, 扇形, 椭圆, 曲线,文字和图片的坐标讲解
- 2015年十大热门Android开源新项目
- 深入浅析Android坐标系统
- Android 反汇编Smali语言中插入log打印
- 获取Android设备唯一标识码
- android中listview分页加载数据
- android点击事件
- Android消息通知(notification)和PendingIntent传值
- Android Ant 和 Gradle 打包流程和效率对照
- Android:meta-data
- Android 应用程序签名
- Android 实现环形进度按钮circular-progress-button
- android学习8——获取view在屏幕上的绝对坐标
- Android百度地图之位置定位和附近查找代码简单实现 (上)
- [看书日记20160106]Activity的Flags , IntentFilter ,Android的消息机制
- Android退出应用最优雅的方式(改进版)
- android之旅22 多媒体编程1: 图片处理
- Android之第三方库封装
- Android图片处理之Fresco使用
- How to export apk from Android device?