Android MediaRecorder JNI(Delphi)

时间:2017-08-10 22:16:25

标签: java android delphi mediarecorder delphi-10.2-tokyo

我正在使用RAD Studio 10.2 Tokyo,我正在使用Delphi进行编程。

我使用JNI库的Java对象存在一般问题。

我要做的是在按下按钮之间找到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音频源的幅度读数,我也会接受这个答案,因为这是我要解决的整体问题。

1 个答案:

答案 0 :(得分:6)

一般来说,在Delphi Android JNI框架内:

  • 使用前缀为TJ的类在Delphi中表示Java类类型,并使用前缀为J的接口在Delphi中表示Java对象实例。

    < / LI>
  • 嵌套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')));