开发环境:android studio 2022.2.1
Android版本: android 13
API: AudioRecord AudioPlaybackCaptureConfiguration MediaProjection
注意:应用的音频能否被捕获也取决于应用的targetSdkVersion,默认情况下Android9.0及之前版本为目标平台的应用不允许捕获播放的音频。需要应用targetSdkVersion为29或以上,并且在应用的AndroidManifest.xml文件中设置android:allowAudioPlaybackCapture = “ture”才能被捕获到。
关键代码如下:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(TAG, "start audio capture");
int resultCode = intent.getIntExtra("resultCode", -1);
Intent resultData = intent.getParcelableExtra("data");
MediaProjectionManager mediaProjectionManager = (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE);
MediaProjection mediaProjection = mediaProjectionManager.getMediaProjection(resultCode, resultData); //获取MediaProjection
if (mediaProjection == null) {
return Service.START_NOT_STICKY;
}
AudioPlaybackCaptureConfiguration audioPlaybackCaptureConfiguration = new AudioPlaybackCaptureConfiguration.Builder(mediaProjection)
.addMatchingUsage(AudioAttributes.USAGE_MEDIA) //内录音乐声音
.addMatchingUsage(AudioAttributes.USAGE_GAME) //内录游戏声音
.build();
int bufferSize = AudioRecord.getMinBufferSize(
48000,
AudioFormat.CHANNEL_IN_STEREO,
AudioFormat.ENCODING_PCM_16BIT);
AudioFormat audioFormat = new AudioFormat.Builder()
.setEncoding(AudioFormat.ENCODING_PCM_16BIT)
.setSampleRate(48000)
.setChannelMask(AudioFormat.CHANNEL_IN_STEREO)
.build();
mRunning = true;
Executors.newSingleThreadExecutor().submit(() -> {
try {
@SuppressLint("MissingPermission")
AudioRecord audioRecord = new AudioRecord.Builder()
.setAudioFormat(audioFormat)
.setBufferSizeInBytes(bufferSize)
.setAudioPlaybackCaptureConfig(audioPlaybackCaptureConfiguration).build();
audioRecord.startRecording();
FileOutputStream fos = new FileOutputStream(getExternalFilesDir(null) + "/record.pcm");
byte[] byteBuffer = new byte[bufferSize];
while (mRunning) {
int size = audioRecord.read(byteBuffer, 0, byteBuffer.length);
if (size >= 0) {
fos.write(byteBuffer, 0, size);
}
}
audioRecord.stop();
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
});
return super.onStartCommand(intent, flags, startId);
}
本文介绍了如何在AndroidStudio2022.2.1环境下使用Android13API进行音频录制,强调了targetSdkVersion对音频捕获权限的影响,以及关键代码片段展示了如何创建和启动AudioRecord实例以捕获音频。
6280

被折叠的 条评论
为什么被折叠?



