Hashim Akhtar
Hashim Akhtar

Reputation: 881

Recording Phone Calls on Android 8+ – Ignore this question, feature is no longer supported by Android

I am trying to record calls on Android 8+ but getting error. Below is my code:

    File sampleDir = new File(Environment.getExternalStorageDirectory(), "/" + RECORDING_DIRECTORY);
    if (!sampleDir.exists()) {
        sampleDir.mkdirs();
    }
    String file_name = getRecordingFileName() + "-";
    //String file_name = "Record";
    try {
        audiofile = File.createTempFile(file_name, ".amr", sampleDir);
    } catch (IOException e) {
        e.printStackTrace();
    }
    String path = Environment.getExternalStorageDirectory().getAbsolutePath();

    recorder = new MediaRecorder();
    recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    recorder.setOutputFile(audiofile.getAbsolutePath());
    try {
        recorder.prepare();
        recorder.start();
        recordstarted = true;
    } catch (IllegalStateException e) {
        e.printStackTrace();
        Log.d(e);
    } catch (IOException e) {
        e.printStackTrace();
        Log.d(e);
    } catch (Exception ex) {
        Log.d(ex);
    }

I get the following error message:

2020-02-20 16:38:37.893 12635-12635/com.companyname.appname W/System.err: java.lang.IllegalStateException: phoneIsInUse

2020-02-20 16:38:37.894 12635-12635/com.companyname.appname W/System.err: at android.media.MediaRecorder.start(MediaRecorder.java:1017)

Has anyone dealt with this or knows what is happening?

Upvotes: 2

Views: 355

Answers (1)

Mohsin kazi
Mohsin kazi

Reputation: 530

For recording Phone Calls on Android 8+.
API level 28 or higher, apps running in the background cannot access the microphone.

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

The example activity below shows how to use MediaRecorder to record an audio file. It Also uses MediaPlayer to play the audio back.

public class AudioRecordTest extends AppCompatActivity {

private static final String LOG_TAG = "AudioRecordTest";
private static final int REQUEST_RECORD_AUDIO_PERMISSION = 200;
private static String fileName = null;

private RecordButton recordButton = null;
private MediaRecorder recorder = null;

private PlayButton   playButton = null;
private MediaPlayer   player = null;

// Requesting permission to RECORD_AUDIO
private boolean permissionToRecordAccepted = false;
private String [] permissions = {Manifest.permission.RECORD_AUDIO};

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode){
        case REQUEST_RECORD_AUDIO_PERMISSION:
            permissionToRecordAccepted  = grantResults[0] == PackageManager.PERMISSION_GRANTED;
            break;
    }
    if (!permissionToRecordAccepted ) finish();

}

private void onRecord(boolean start) {
    if (start) {
        startRecording();
    } else {
        stopRecording();
    }
}

private void onPlay(boolean start) {
    if (start) {
        startPlaying();
    } else {
        stopPlaying();
    }
}

private void startPlaying() {
    player = new MediaPlayer();
    try {
        player.setDataSource(fileName);
        player.prepare();
        player.start();
    } catch (IOException e) {
        Log.e(LOG_TAG, "prepare() failed");
    }
}

private void stopPlaying() {
    player.release();
    player = null;
}

private void startRecording() {
    recorder = new MediaRecorder();
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    recorder.setOutputFile(fileName);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

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

    recorder.start();
}

private void stopRecording() {
    recorder.stop();
    recorder.release();
    recorder = null;
}

class RecordButton extends Button {
    boolean mStartRecording = true;

    OnClickListener clicker = new OnClickListener() {
        public void onClick(View v) {
            onRecord(mStartRecording);
            if (mStartRecording) {
                setText("Stop recording");
            } else {
                setText("Start recording");
            }
            mStartRecording = !mStartRecording;
        }
    };

    public RecordButton(Context ctx) {
        super(ctx);
        setText("Start recording");
        setOnClickListener(clicker);
    }
}

class PlayButton extends Button {
    boolean mStartPlaying = true;

    OnClickListener clicker = new OnClickListener() {
        public void onClick(View v) {
            onPlay(mStartPlaying);
            if (mStartPlaying) {
                setText("Stop playing");
            } else {
                setText("Start playing");
            }
            mStartPlaying = !mStartPlaying;
        }
    };

    public PlayButton(Context ctx) {
        super(ctx);
        setText("Start playing");
        setOnClickListener(clicker);
    }
}

@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);

    // Record to the external cache directory for visibility
    fileName = getExternalCacheDir().getAbsolutePath();
    fileName += "/audiorecordtest.3gp";

    ActivityCompat.requestPermissions(this, permissions, REQUEST_RECORD_AUDIO_PERMISSION);

    LinearLayout ll = new LinearLayout(this);
    recordButton = new RecordButton(this);
    ll.addView(recordButton,
            new LinearLayout.LayoutParams(
                    ViewGroup.LayoutParams.WRAP_CONTENT,
                    ViewGroup.LayoutParams.WRAP_CONTENT,
                    0));
    playButton = new PlayButton(this);
    ll.addView(playButton,
            new LinearLayout.LayoutParams(
                    ViewGroup.LayoutParams.WRAP_CONTENT,
                    ViewGroup.LayoutParams.WRAP_CONTENT,
                    0));
    setContentView(ll);
}

@Override
public void onStop() {
    super.onStop();
    if (recorder != null) {
        recorder.release();
        recorder = null;
    }

    if (player != null) {
        player.release();
        player = null;
    }
  }
 }

Make changes according to your project

this code referred from official website for more details follow official website MediaRecorder overview

Upvotes: 5

Related Questions