基于pjsip的Android网络电话中新增通话录音功能

1.添加录音权限:在你的AndroidManifest.xml文件中,添加以下权限:

<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

第一个权限允许你的应用录制音频,第二个权限允许你的应用将录音保存到存储设备上。

2.添加录音按钮:在你的通话界面布局文件中,添加一个录音按钮。例如,可以在你的activity_main.xml文件中添加一个Button控件:

<Button
    android:id="@+id/recordButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="录音" />


3.录音功能的实现:在你的Activity或Fragment类中,添加以下代码:

import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    private Button recordButton;
    private AudioRecord audioRecord;
    private boolean isRecording = false;
    private Thread recordingThread;
    private String recordFilePath;

    // 音频参数
    private static final int AUDIO_SOURCE = MediaRecorder.AudioSource.VOICE_COMMUNICATION;
    private static final int SAMPLE_RATE = 8000;
    private static final int CHANNEL_CONFIG = AudioFormat.CHANNEL_IN_MONO;
    private static final int AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recordButton = findViewById(R.id.recordButton);
        recordButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (isRecording) {
                    stopRecording();
                } else {
                    startRecording();
                }
            }
        });
    }

    // 开始录音
    private void startRecording() {
        isRecording = true;
        recordButton.setText("停止录音");

        audioRecord = new AudioRecord(AUDIO_SOURCE, SAMPLE_RATE, CHANNEL_CONFIG, AUDIO_FORMAT,
                AudioRecord.getMinBufferSize(SAMPLE_RATE, CHANNEL_CONFIG, AUDIO_FORMAT) * 10);

        // 创建保存录音文件的目录
        File recordDir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Recordings");
        if (!recordDir.exists()) {
            recordDir.mkdirs();
        }

        // 创建录音文件
        String fileName = "recording_" + System.currentTimeMillis() + ".pcm";
        File recordFile = new File(recordDir, fileName);
        recordFilePath = recordFile.getAbsolutePath();

        recordingThread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    // 创建文件输出流
                    DataOutputStream outputStream = new DataOutputStream(new FileOutputStream(recordFile));
                    byte[] buffer = new byte[8192];
                    audioRecord.startRecording();

                    while (isRecording) {
                        int read = audioRecord.read(buffer, 0, buffer.length);
                        if (read > 0) {
                            outputStream.write(buffer, 0, read);
                        }
                    }

                    audioRecord.stop();
                    audioRecord.release();
                    audioRecord = null;
                    outputStream.close();

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            recordButton.setText("开始录音");
                            Toast.makeText(MainActivity.this, "录音已保存:" + recordFilePath, Toast.LENGTH_LONG).show();
                        }
                    });
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

        recordingThread.start();
    }

    // 停止录音
    private void stopRecording() {
        isRecording = false;
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (isRecording) {
            stopRecording();
        }
    }
}

在 onCreate 方法中初始化录音按钮并为其添加点击事件监听器。当录音按钮被点击时,根据当前录音状态执行开始或停止录音的操作。
在 startRecording() 方法中,首先设置录音状态和按钮文本,在创建 AudioRecord 对象前,我们创建了保存录音文件的目录,并生成录音文件路径。接下来,我们创建了一个录音线程,该线程在循环中读取音频数据并将其写入文件。当停止录音时,我们停止 AudioRecord,释放资源,并关闭输出流。最后,在主线程中更新按钮文本并显示保存录音文件的提示。
在 stopRecording() 方法中,我们将录音状态设置为 false,以便让录音线程退出循环并停止录音。
 

  • 11
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值