问题描述
- 电话录音导出的文件为什么不能播放?
-
写了一个电话录音的程序,但是在向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就好了
解决方案二:
答案就是还没录完你就开始导出。
时间: 2024-07-30 13:27:38