咨询Android P+兼容的非SDK接口RESOURCE_VIDEO_CAPTURE替代方案
解决Android P+下
AudioManager.getOutputLatency()非SDK接口兼容问题 问题背景
在WebView中调用request.grant(new String[]{PermissionRequest.RESOURCE_VIDEO_CAPTURE});时触发Non-SDK API使用违规,涉及Landroid/media/AudioManager;->getOutputLatency(I)I接口,该接口在Android P(API 28)及以上版本被限制调用。
兼容替代方案
1. 通过AudioTrack估算输出延迟
Android P及以上可借助AudioTrack的API间接获取音频输出延迟,步骤如下:
- 从
AudioManager获取系统音频输出的采样率、缓冲帧大小等配置 - 创建临时
AudioTrack实例匹配系统配置 - 调用
AudioTrack.getLatency()获取延迟值 - 使用完成后及时释放
AudioTrack资源
示例代码:
public int getOutputLatencyCompat(Context context) { AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); // 获取系统输出采样率 String sampleRateStr = audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE); int sampleRate = sampleRateStr != null ? Integer.parseInt(sampleRateStr) : 44100; // 获取系统输出缓冲帧大小 String frameSizeStr = audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER); int frameSize = frameSizeStr != null ? Integer.parseInt(frameSizeStr) : 512; // 创建临时AudioTrack实例 AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, frameSize * 2, AudioTrack.MODE_STATIC); int latency = audioTrack.getLatency(); audioTrack.release(); // 释放资源 return latency; }
2. 针对媒体编解码场景使用MediaCodec.getOutputLatency()
如果延迟需求和视频捕获、媒体编解码流程相关,可直接调用MediaCodec.getOutputLatency(long timeoutUs)方法获取编解码环节的延迟,该方法属于公开SDK接口,适配Android P+所有版本。
注意事项
- 临时创建
AudioTrack存在轻微性能开销,建议缓存计算结果,避免频繁创建实例 - 不同设备硬件配置存在差异,估算的延迟值与原
AudioManager.getOutputLatency()可能有细微偏差,但可满足绝大多数业务场景需求
内容的提问来源于stack exchange,提问作者SanSoft InfoTech - Support
相关产品推荐
相关产品推荐

