写了一个电话录音的程序,但是在向SD卡中刻录声音的时候,并不是期望的3gp格式,无法进行播放,不知道是什么原因?
代码如下
配置文件:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.xushuai.phonelistener"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15" />
<application android:label="@string/app_name"
android:icon="@drawable/ic_launcher"
android:theme="@style/AppTheme">
<service android:name=".PhoneService"></service>
<receiver android:name=".BootBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
</application>
<!-- 电话状态监听权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<!--向SD卡写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- 在SD卡中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 刻录权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
</manifest>
刻录的业务类:
import java.io.File;
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;
public class PhoneService extends Service {
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
//在创建服务时,进行一些初始化
@Override
public void onCreate() {
super.onCreate();
//获取电话管理服务
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
telephonyManager.listen(new PhoneListener(), PhoneStateListener.LISTEN_CALL_STATE);//通过监听对象对呼叫状态进行监听
}
private final class PhoneListener extends PhoneStateListener{
private String incomingNumber;
private File file;
private MediaRecorder mediaRecorder;
//当呼叫状态改变时,调用该方法
@Override
public void onCallStateChanged(int state, String incomingNumber) {
try {
switch (state) {
case TelephonyManager.CALL_STATE_RINGING://来电
this.incomingNumber = incomingNumber;
break;
case TelephonyManager.CALL_STATE_OFFHOOK://接通电话
file = new File(Environment.getExternalStorageDirectory(),incomingNumber+System.currentTimeMillis());
mediaRecorder = new MediaRecorder();
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//指定声音来源:话筒,这里只能录打电话的声音,而不能录入传入的声音
//mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//设置音频输出格式
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);//THREE_GPP);//设置音频输出格式
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//设置音频编码格式
mediaRecorder.setOutputFile(file.getAbsolutePath());
mediaRecorder.prepare();
mediaRecorder.start();//开始录音
case TelephonyManager.CALL_STATE_IDLE://挂断电话后回归到空闲状态
if(mediaRecorder!=null)
mediaRecorder.stop();
mediaRecorder.release();
mediaRecorder = null;
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
通过广播接收者进行应用的注册,这里的广播接收者监听的是手机启动的广播
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class BootBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent service = new Intent(context,PhoneService.class);
context.startService(service);//Intent激活组件(Service)
}
}
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
你这里设置的录音格式是 amr啊,录出来的当然不是3gpp格式的了,改成 3gpp就好了
答案就是还没录完你就开始导出。