Нет виртуального метода MediaRecorder.setOutputFile с API <26? - PullRequest
0 голосов
/ 18 октября 2018

Я записываю аудио в своем приложении и борюсь с классом MediaRecorder в

import android.media.MediaRecorder;

Проблема в том, что код компилируется, но, похоже, не работает на устройствах с уровнем API <26, потому что, по-видимому,функция <code>MediaRecorder.setOutputFormat() не существует до API 26 согласно встроенному сообщению об ошибке в Android Studio.Точно так же, когда я запускаю код на эмуляторе с 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)

В качестве быстрого исправления я просто увеличил минимальный уровень SDK в файле gradle до 26, и все работает простохорошо.Однако я не хочу, чтобы мое приложение было ограничено Android 8.0 и выше, потому что 7.x по-прежнему так популярен.

Так что мой первый вопрос такой: как это может бытьнедоступна только одна функция из всей библиотеки MediaRecorder, как люди использовали MediaRecorder до API 26?Я не могу найти что-либо об этом в Интернете.

Второй вопрос : Как я могу решить проблему, чтобы я мог записывать звук для 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();
        }
    }
}

Вот мой файл gradle:

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

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

При использовании уровня API ниже 26 вы можете вместо этого передать строку, содержащую путь к файлу.Если вам конкретно нужно работать с объектом File, используйте file.getAbsolutePath() в Java или file.absolutePath в Kotlin.

0 голосов
/ 06 января 2019

setOutputFile работает работает со строкой в ​​качестве аргумента, а не файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...