在 Android 8+ 上录音电话 – 忽略这个问题,Android 不再支持该功能

问题描述 投票:0回答:1

我尝试在 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:位于 android.media.MediaRecorder.start(MediaRecorder.java:1017)

有人处理过这个问题或者知道发生了什么事吗?

java android mediarecorder
1个回答
5
投票

用于在 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 概述

© www.soinside.com 2019 - 2024. All rights reserved.