没有虚拟方法 MediaRecorder.setOutputFile with API < 26?



我正在我的应用程序中录制音频,但我正在努力使用MediaRecorder类

import android.media.MediaRecorder;

问题是代码可以编译,但似乎无法在 API 级别为 <26 的设备上运行,因为根据 Android Studio 中的内联错误消息,显然该函数MediaRecorder.setOutputFormat()在 API 26 之前不存在。同样,当我在使用 API 24 的模拟器上运行代码时,我遇到崩溃并出现运行时错误:

java.lang.NoSuchMethodError: No virtual method setOutputFile(Ljava/io/File;)V in class Landroid/media/MediaRecorder; or its super classes (declaration of 'android.media.MediaRecorder' appears in /system/framework/framework.jar)

作为快速修复,我只是将 gradle 文件中的最低 SDK 级别增加到 26,一切都很好。但是,我不希望我的应用程序仅限于Android 8.0及更高版本,因为7.x仍然很受欢迎。

所以我的第一个问题是:为什么整个MediaRecorder库中只有一个功能不可用,人们在 API 26 之前如何使用MediaRecorder?我在网上找不到任何关于这方面的信息。

第二个问题:如何解决问题,以便录制 API 级别 24+ 的音频?我必须使用其他库吗?

这是我的活动的一部分,我正在设置记录器并开始录制。同样,当最小 SDK 为 26 时,这工作正常......

private MediaRecorder recorder;
private void startRecording(){
if(!recordingActive) {
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setAudioChannels(1);
recorder.setOutputFormat(output_formats[currentFormat]);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
switch(activeAudioButton) {
case AUDIO_BUTTON_A:
recorder.setOutputFile(tempSoundFileA); // <-- 
break;
case AUDIO_BUTTON_B:
recorder.setOutputFile(tempSoundFileB); // <-- 
break;
}
recorder.setOnErrorListener(errorListener);
recorder.setOnInfoListener(infoListener);
try {
recorder.prepare();
recorder.start();
recordingActive = true;
runOnUiThread(new Runnable() {
@Override
public void run() {
speakNowTextView.setVisibility(View.VISIBLE);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}

这是我的毕业文件:

apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.my.app"
minSdkVersion 24
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation 'com.android.support:support-v4:28.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'com.android.support:recyclerview-v7:28.0.0'
implementation 'com.android.support:design:28.0.0'
implementation 'com.android.support:preference-v7:28.0.0'
implementation 'com.android.support:recyclerview-v7:28.0.0'
}

使用低于 26 的 API 级别时,可以改为传入包含文件路径的字符串。如果您特别需要使用 File 对象,请在 Java 中使用file.getAbsolutePath(),在 Kotlin 中使用file.absolutePath

setOutputFile可以使用String作为参数而不是文件。

相关内容

最新更新