【问题标题】:I am trying to record calls. I can record call but i dont know where to stop recorder. Below is my Code我正在尝试记录通话。我可以记录通话,但我不知道在哪里停止录音机。下面是我的代码
【发布时间】:2014-09-11 06:26:29
【问题描述】:

这是我的 CallBroadcastReceiver,我正在尝试记录通话。它可以在没有 recorder.stop 方法的情况下正常工作。当我添加停止方法时,它会使应用程序崩溃。

给我建议我应该在哪里调用 StopRecording 方法。这样我就可以恢复 recoder 并将文件保存在 Sdcard 中。

我试图将 stopRecording 放在 TelephonyManager.CALL_STATE_IDLE 开关盒中,但它只是崩溃记录。并且不记录任何内容或不创建文件。

public class CallBroadcastReceiver extends BroadcastReceiver 
{
String path = "/sdcard/AudioRecording";
private final int audioformat = 3;
public class MyPhoneStateListener extends PhoneStateListener implements  
SensorEventListener 
{
     Context context;
    AudioManager audioManager;
    MediaRecorder recorder;
    private SensorManager mSensorManager;
    private Sensor myLightSensor;
    private boolean CallState;
    private float sensorState;
    public MyPhoneStateListener(Context arg0) 
    {
        // TODO Auto-generated constructor stub
        this.context = arg0;
        mSensorManager = (SensorManager)
this.context.getSystemService(Context.SENSOR_SERVICE);
        myLightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
        audioManager = (AudioManager)
this.context.getSystemService(Context.AUDIO_SERVICE);
        if (myLightSensor == null)
        {
            Log.i("On Receive", "Not Support");
        }
        else
        {
mSensorManager.registerListener(this,myLightSensor,
SensorManager.SENSOR_DELAY_NORMAL);
        }
    }

    @Override
    public void onCallStateChanged(int state, String incomingNumber) 
    {
        // TODO Auto-generated method stub
        switch (state) 
        {
        case TelephonyManager.CALL_STATE_IDLE:

            System.out.println("My Call IDLE");
            CallState = false;
            StartAudioSpeacker();
            //StopRecording();
            System.out.println("Is phone speaker : "+
audioManager.isSpeakerphoneOn());
            if (audioManager.isSpeakerphoneOn()) {
                audioManager.setSpeakerphoneOn(false);
                mSensorManager.unregisterListener(this);
            }
            break;

        case TelephonyManager.CALL_STATE_OFFHOOK :

            System.out.println("My Call OFFHOOK");
            CallState = true;
            StartAudioSpeacker();
            StartRecording();
            System.out.println("Is phone speaker : "+
audioManager.isSpeakerphoneOn());
            break;

        case TelephonyManager.CALL_STATE_RINGING :
             System.out.println("My Call RINGING");
             break;
        default:
            break;
        }
    }

    private void StartAudioSpeacker() 
    {
        // TODO Auto-generated method stub
        if (CallState && sensorState == 1.0) 
        {
            audioManager = (AudioManager)
this.context.getSystemService(Context.AUDIO_SERVICE);
            audioManager.setSpeakerphoneOn(true);
            audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,
AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI);
            audioManager.setStreamVolume(AudioManager.MODE_IN_CALL,  
audioManager.getStreamMaxVolume(AudioManager.MODE_IN_CALL), 1);
            System.out.println("Is phone speaker : "+ 
audioManager.isSpeakerphoneOn());
        }
        else
        {
            audioManager = (AudioManager)
this.context.getSystemService(Context.AUDIO_SERVICE);
            audioManager.setSpeakerphoneOn(false);
            audioManager.setStreamVolume(AudioManager.MODE_IN_CALL,
audioManager.getStreamMaxVolume(AudioManager.MODE_IN_CALL), 1);
            System.out.println("Speaker Volume :"+ 
audioManager.getStreamMaxVolume(AudioManager.MODE_IN_CALL));
            System.out.println("Is phone speaker : "+ 
audioManager.isSpeakerphoneOn());
        }

    }
    private void StartRecording() 
    {
        // TODO Auto-generated method stub

         recorder = new MediaRecorder();
         recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
         recorder.setOutputFormat(audioformat);
         recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
         recorder.setOutputFile(path+"test.amr");
         try {
            recorder.prepare();
        } catch (IllegalStateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        recorder.start();   // Recording is now started
        Log.i(this.getClass().getName(), "Start Recording");

    }

    private void StopRecording() 
    {
        // TODO Auto-generated method stub
        recorder.stop();
        recorder.reset();   
        recorder.release();
        Log.i(this.getClass().getName(), "Stop Recording");
    }
@Override
    public void onAccuracyChanged(Sensor arg0, int arg1)
    {
        // TODO Auto-generated method stub
        if (arg0.getType() == Sensor.TYPE_PROXIMITY) 
        {
            Log.i("Sensor Changed", "Accuracy :" + arg1);
        }

    }
    @Override
    public void onSensorChanged(SensorEvent arg0) 
    {
        // TODO Auto-generated method stub
        if (arg0.sensor.getType() == Sensor.TYPE_PROXIMITY) 
        {
            Log.i("Sensor Changed", "onSensor Change :" + arg0.values[0]);
            sensorState = arg0.values[0];
            StartAudioSpeacker();
        }
    }
}
public void onReceive(Context arg0, Intent arg1) 
{

      TelephonyManager tmanager = 
(TelephonyManager)arg0.getSystemService(Context.TELEPHONY_SERVICE);
      MyPhoneStateListener PhoneListener = new MyPhoneStateListener(arg0);
     tmanager.listen(PhoneListener, PhoneStateListener.LISTEN_CALL_STATE);
}       

}   

【问题讨论】:

    标签: android audio-recording telephonymanager phone-call


    【解决方案1】:

    当您将 CALL_STATE_IDLE 作为新状态时停止录制。 这意味着通话已经结束...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-13
      • 1970-01-01
      • 2015-04-22
      • 1970-01-01
      相关资源
      最近更新 更多