【问题标题】:Problems with Android MediaRecorder JNI (Delphi)Android MediaRecorder JNI (Delphi) 的问题
【发布时间】:2017-08-10 22:16:24
【问题描述】:

我正在使用 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 音频源获取振幅读数的另一种方法,我也会接受它作为答案,因为这是我要解决的总体问题。

【问题讨论】:

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


    【解决方案1】:

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

    • 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')));
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-15
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 2014-10-19
    相关资源
    最近更新 更多