【问题标题】:On Call HangUp, Media Recorder does not stop and save the recorded call在通话挂断时,媒体记录器不会停止并保存记录的通话
【发布时间】:2017-08-18 20:56:55
【问题描述】:

我是 Android 编程新手。我正在尝试构建通话记录器。我能够检测到来电并成功启动媒体记录器并录制语音。但是在 Call Disconnect 时,Stop() 方法不会触发。当我关闭应用程序时它会停止。除了 stop() 之外,一切都在工作。当我关闭应用程序时,录音也会保存。 通话断开后如何Stop()录音?

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.Environment;
import android.telephony.TelephonyManager;
import java.io.IOException;
import java.util.Calendar;

public class nCallReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {





MediaRecorder callrecorder = new MediaRecorder();

        if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_RINGING)) {
            String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
            Calendar c = Calendar.getInstance();
            int tm = c.get(Calendar.DATE);
            int tx = c.get(Calendar.SECOND);
            String timex = tm+"-"+tx;


            callrecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            callrecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
            callrecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

            callrecorder.setOutputFile(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + incomingNumber +"-"+ timex+"-"+tx+".mp4");
            try {
                callrecorder.prepare();
            } catch (IOException e) {
                e.printStackTrace();
            }

            callrecorder.start();

            if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_IDLE)
                    || intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
                    TelephonyManager.EXTRA_STATE_OFFHOOK)) {

                callrecorder.stop();
                callrecorder.release();
            }


        }
    }
}

**

编辑 2

** 我如何停止()媒体记录器? 我尝试实例化

MediaRecorder r;

在全球范围内,

r.stop()

不起作用,因为 r 没有被实例化。

如果可以保存此 MediaRecorder Instance 的状态,并在稍后与 stop 方法一起使用,我该怎么做?

public class nCallRecorder extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_RINGING)) {
            //start recording
            String CallNo = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
            MediaRecorder r = new MediaRecorder();
            r.setAudioSource(MediaRecorder.AudioSource.MIC);
            r.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
            r.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
            r.setOutputFile(Environment.getExternalStorageDirectory().getAbsolutePath()+"/"+CallNo+".mp4");
            try { r.prepare(); } catch(IOException e) { e.printStackTrace(); }
            r.start();

        } else if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_IDLE)) {
            //stop recording
            Toast.makeText(context,"Call Ends",Toast.LENGTH_LONG).show();
        }
    }
}

【问题讨论】:

  • 仅仅声明一个MediaRecorder 是不够的。您仍然必须在某处为其分配一个 MediaRecorder 实例(即 r = new MediaRecorder();)。您可以在开始录制时执行此操作,就在 r.setAudioSource 之前。

标签: android audio-recording android-mediarecorder phone-call


【解决方案1】:

检查状态是否已更改为IDLE 似乎在if intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_RINGING)) { 内。你可能想要这样的东西:

if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_RINGING)) {
    // start recording
} else if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_IDLE) {
    // stop recording
}

此外,每次调用 BroadcastReceiver 时,您都会创建一个新的 MediaRecorder 实例。您应该只在开始录制时创建一个MediaRecorder 实例,并保存该实例以便以后停止它。


另一件小事是你有intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_OFFHOOK) 在你的条件下是否应该停止录制。 “摘机”不代表你挂断了;这意味着“至少存在一个正在拨号、激活或保持的呼叫”。

【讨论】:

  • 如何保存 MediaRecorder 实例?还有,我如何重用保存的状态?
猜你喜欢
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 2021-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多