light_sky 2013-01-28 11:24 采纳率: 0%
浏览 6205

电话录音导出的文件为什么不能播放?

写了一个电话录音的程序,但是在向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)
    }

}
  • 写回答

2条回答 默认 最新

  • balmy 2013-01-29 02:00
    关注
    mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    

    你这里设置的录音格式是 amr啊,录出来的当然不是3gpp格式的了,改成 3gpp就好了

    评论

报告相同问题?

悬赏问题

  • ¥15 flink cdc无法实时同步mysql数据
  • ¥100 有人会搭建GPT-J-6B框架吗?有偿
  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决