Запись телефонных звонков на Android 8+ - PullRequest
2 голосов
/ 20 февраля 2020

Я пытаюсь записать вызовы на Android 8+, но получаю сообщение об ошибке. Ниже мой код:

    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);
    }

Я получаю следующее сообщение об ошибке:

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)

Кто-нибудь имел дело с этим или знает, что происходит?

1 Ответ

3 голосов
/ 27 февраля 2020

Для записи телефонных звонков на Android 8 +.
API уровня 28 или выше, приложения, работающие в фоновом режиме, не могут получить доступ к микрофону.

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

Пример действия ниже показывает, как использовать MediaRecorder для записи аудиофайла. Он также использует MediaPlayer для воспроизведения аудио.

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;
    }
  }
 }

Внесите изменения в соответствии с вашим проектом

этот код ссылается на официальный сайт для получения более подробной информации следуйте официальному сайту Обзор MediaRecorder

...