如何在android中录制一个电话?

时间:2011-04-12 05:50:55

标签: android

Recorder = new MediaRecorder();     
Recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
Recorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR); 
Recorder.setOutputFile(FileName); 
Recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

这是我的代码,我无法记录其他人的声音。那么我应该使用什么而不是AudioSorce.MIC。 请帮助我

6 个答案:

答案 0 :(得分:4)

很抱歉让你失望,但你不能,不是一般情况下。大多数Android运行的手机都有硬件/固件接线,因此呼叫媒体根本不会通过应用处理器 - 它从音频到DSP,反之亦然,因此您无法访问它。

您可以使用手机捕捉到该人的音频,但不是相反,无视愚蠢的黑客,例如要求此人使用扬声器并通过手机麦克风录制声音......

答案 1 :(得分:3)

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 context) {
            this.context = context;
            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);
            }
        }

        public void onCallStateChanged(int state, String incomingNumber) {
            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;
            }
        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
            if (sensor.getType() == Sensor.TYPE_PROXIMITY) {
                Log.i("Sensor Changed", "Accuracy :" + accuracy);
            }
        }

        public void onSensorChanged(SensorEvent event) {
            if (event.sensor.getType() == Sensor.TYPE_PROXIMITY) {
                Log.i("Sensor Changed", "onSensor Change :" + event.values[0]);
                sensorState = event.values[0];
                StartAudioSpeacker();
            }
        }

        public void StartAudioSpeacker(){
            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());
            }
        }
        public void StartRecording(){
             recorder = new MediaRecorder();
             recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);
             recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
             recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
             recorder.setOutputFile(this.getFullSdPath());
             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");
        }

        public void StopRecording(){
             recorder.stop();
             recorder.reset();   
             recorder.release();
             Log.i(this.getClass().getName(), "Stop Recording");
        }

        public String getFullSdPath(){
            File sdCard = new File(Environment.getExternalStorageDirectory()    + "/RecordMyVoice");
            if (!sdCard.exists()) {
                sdCard.mkdir();
            }
            File file = new File(Environment.getExternalStorageDirectory()+"/RecordMyVoice/",new Date().getTime()+".3gp");
            System.out.println("Full path of record sound is : "+file.getAbsolutePath());
            return file.getAbsolutePath();
        }
    }

答案 2 :(得分:1)

正如我所知,我已经完成了这种工作。我的意思是用户的声音和其他人的声音。我们使用了特定工厂提供的一部手机的定制ROM,他们也修改了一些ROM的安全机制。另一种方法你可以试试这个:

https://github.com/FR13NDS/call-recorder-for-android

答案 3 :(得分:0)

尝试使用此代码录制电话。

AudioManager audioManager;
private MediaRecorder myAudioRecorder;
//Myservice m=new Myservice();
   private String outputFile = null;
   String uid=null;
   String no=null;
   String rname=null;

public void record(Context c,String no, String ser){
    try{
    this.no=no;
    uid=ser;
    rname=String.format("%d.mp3", System.currentTimeMillis());
    //rname="/#"+uid+"#"+rname;
     outputFile = Environment.getExternalStorageDirectory().toString() + "/Android/free"+"/#"+uid+"#"+no+"#"+rname;
      StartAudioSpeacker();
      myAudioRecorder=new MediaRecorder();
      myAudioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
      myAudioRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
      myAudioRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
      myAudioRecorder.setOutputFile(outputFile);
      }catch(IllegalStateException e){e.printStackTrace();}
        try {
            myAudioRecorder.prepare();
             myAudioRecorder.start();
        } catch (IllegalStateException | IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


 }
 public void getc(Context c) {
    // TODO Auto-generated method stub
     this.c=c;

}
public void st()
 { //Toast.makeText(;, "recorded",Toast.LENGTH_LONG).show();
    try{
     myAudioRecorder.stop();
     myAudioRecorder.release();
     myAudioRecorder=null;
    }
    catch(IllegalStateException e)
    {
        e.printStackTrace(); 
    }
     Handler h=new Handler();
     h.postDelayed(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            try{
            uprecord ur=new uprecord("/#"+uid+"#"+no+"#"+rname);
             ur.tt();
            }catch(IllegalStateException e){e.printStackTrace();}   }
    }, 1000);

 }

 public void StartAudioSpeacker(){



         audioManager = (AudioManager) c.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());
 }

}

答案 4 :(得分:-1)

如果您尝试将音频文件存储到SD卡,请尝试使用此代码。它会正常工作。

 protected void startRecording() {

    mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
    mFileName += "/audiorecordtest.3gp";
    mRecorder = new MediaRecorder();
    mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    mRecorder.setOutputFile(mFileName);
    mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

    try {
        mRecorder.prepare();
    } catch (IOException e) {
        Log.e(LOG_TAG, "prepare() failed");
    }
    mRecorder.start();        
}
}

答案 5 :(得分:-1)

我没有在手机上试过,但根据文档MediaRecorder.AudioSource,您应该使用

MediaRecorder.AudioSource.VOICE_CALL 代替 MediaRecorder.AudioSource.MIC

希望有效