2017-08-10 110 views
2

我正在使用RAD Studio 10.2東京和在Delphi編程。Android MediaRecorder JNI問題(德爾福)

我對使用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音頻源讀取振幅的方法,我也會接受這個答案,因爲這是我正在嘗試解決的整體問題。

回答

6

一般來說,在Delphi的Android JNI框架內:

  • Java類類型正在使用的前綴爲TJ類在Delphi表示,並且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 stri ngs,並使用JStringToString()將JNI字符串轉換爲Delphi字符串。這兩個功能都在Delphi RTL中,具體取決於您使用的Delphi版本,具體爲Androidapi.Helpers單元(XE6 +)或Androidapi.JNI.JavaTypes單元(XE5)。

Recorder.setOutputFile(StringToJString(TPath.Combine(TPath.GetTempPath, 'test'))); 
+0

感謝您的快速和知識的答案。你偶然知道了解這種跨語言程序設計的好資源嗎?我還沒有找到一個全面的來源。 – Michael

+1

@Michael這些可能有所幫助:https://www.youtube.com/watch?v = GcuYc7F0lIU,http://blog.blong.com/search/label/Android –