Проблемы с Android MediaRecorder JNI (Delphi)

Я использую RAD Studio 10.2 Tokyo и программирую в Delphi.

У меня общие проблемы с объектом Java с использованием библиотек JNI.

Я пытаюсь найти максимальную амплитуду звука источника звука Android между нажатиями кнопок.

Вот код, который я использую.

var
  Form1: TForm1;
  Recorder: JMediaRecorder;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if not assigned(Recorder) then
  begin
    Recorder:= TJMediaRecorder.Create();
    Recorder.setAudioSource(1);
    Recorder.setOutputFormat(1);
    Recorder.setAudioEncoder(1);
    Recorder.setOutputFile(TPath.GetTempPath+'/test');
    Recorder.prepare();
    Recorder.start();
  end;
  Label1.Text:=IntToStr(Recorder.getMaxAmplitude());
end;

Это, кажется, создает несколько проблем.

Проблема №1:

Хотя я в курсе, что в java настройки медиа-рекордера должны выглядеть примерно так

Recorder.setAudioSource(MediaRecorder.AudioSource.MIC).

Это не то, что я могу ввести в RAD Studio. Я взглянул на API и обнаружил, что это должно означать целое число 1. Проблема в том, что он дает мне сообщение об ошибке, говорящее, что он не может найти источник звука.

Проблема №2:

Мне нужно установить путь к файлу, используя

Recorder.setOutputFile()

Проблема в том, что он принимает только JStrings в качестве входных данных. Я посмотрел повсюду и нашел несколько человек, которые используют

StringToJString('my super cool string')

Я думаю, что это часть библиотеки, о которой я не знаю, потому что она не работает, когда я ее использую.

Если вы знаете другой способ получить показания амплитуды от источника звука Android, я бы также принял это как ответ, поскольку это общая проблема, которую я пытаюсь решить.


person Michael    schedule 10.08.2017    source источник


Ответы (1)


В целом, в рамках Delphi Android JNI framework:

  • Типы классов Java представлены в Delphi с помощью классов с префиксом TJ, а экземпляры объектов Java представлены в Delphi с помощью интерфейсов с префиксом J.

  • вложенные классы Java представлены классами и интерфейсами Delphi, которые названы в честь имени родительского класса, за которым следует _, за которым следует имя вложенного класса.

  • Статические константы/поля/свойства/методы Java представлены в Delphi как подсвойства/методы специального свойства класса JavaClass.

Итак, в вашем случае:

  • класс Java MediaRecorder представлен классом TJMediaRecorder и интерфейсом JMediaRecorder.

  • класс Java MediaRecorder.AudioSource представлен классом TJMediaRecorder_AudioSource и интерфейсом JMediaRecorder_AudioSource.

  • константа Java MediaRecorder.AudioSource.MIC представлена ​​свойством класса TJMediaRecorder_AudioSource.JavaClass.MIC:

    Recorder.setAudioSource(TJMediaRecorder_AudioSource.JavaClass.MIC);
    

То же самое относится и к методам MediaRecorder.setOutputFormat() и MediaRecorder.setAudioEncoder():

Recorder.setOutputFormat(TJMediaRecorder_OutputFormat.JavaClass.THREE_GPP);
Recorder.setAudioEncoder(TJMediaRecorder_AudioEncoder.JavaClass.AMR_NB);

Что касается строк, JNI ничего не знает о строках Delphi, поэтому вы должны использовать StringToJString() для преобразования строк Delphi в строки JNI и использовать JStringToString() для преобразования строк JNI в строки Delphi. Обе функции находятся в Delphi RTL, а именно в модуле Androidapi.Helpers (XE6+) или Androidapi.JNI.JavaTypes (XE5), в зависимости от используемой версии Delphi.

Recorder.setOutputFile(StringToJString(TPath.Combine(TPath.GetTempPath, 'test')));
person Remy Lebeau    schedule 10.08.2017
comment
Спасибо за ваш быстрый и знающий ответ. Вы случайно не знаете хороший источник, чтобы узнать об этом типе межъязыкового программирования? Я еще не нашел всеобъемлющего источника. - person Michael; 11.08.2017
comment
@Michael Это может быть полезно: youtube.com/watch?v=GcuYc7F0lIU, blog.blong.com/search/label/Android - person Dave Nottage; 11.08.2017