Сделал простой пример приложения рации в локальной сети под Android. Реализация через UDP.
Буду рад, если кому окажется полезным.
Для начала/окончания сеанса связи нужно нажать на окружность
Для проверки нужно 2 телефона
unit Unit5;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
FMX.Controls.Presentation, FMX.StdCtrls, IdUDPServer, IdBaseComponent,
IdComponent, IdUDPBase, IdUDPClient, IdGlobal, IdSocketHandle, Androidapi.JNI.Media,
Androidapi.JNI.JavaTypes, Androidapi.JNIBridge, AndroidApi.JNI, AndroidApi.Helpers,
FMX.Objects, System.Math;
type
TForm1 = class(TForm)
Circle: TCircle;
procedure ServerUDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle);
procedure FormCreate(Sender: TObject);
procedure CircleTap(Sender: TObject; const Point: TPointF);
end;
TSendThread = class(TThread)
protected
procedure Execute; override;
end;
var
Form1: TForm1;
SendThread: TSendThread;
Server: TIdUDPServer;
audioRecord: JaudioRecord;
audiotrack: JAudioTrack;
recording: boolean;
buffer_Size, port,ch_in, ch_out, format, freq, source: integer;
implementation
{$R *.fmx}
procedure TSendThread.Execute;
var buffer: TJavaArray<Byte>;
begin
buffer := TJavaArray<Byte>.create(buffer_size);
while recording do begin
audioRecord.read(buffer,0,buffer_size);
Server.Broadcast(TIDBytes(TJavaArrayToTBytes(buffer)),port);
end;
buffer.Free;
end;
procedure TForm1.CircleTap(Sender: TObject; const Point: TPointF);
begin
recording:= not recording;
if recording then begin
Circle.Fill.Color:=TAlphaColors.Red;
Server.OnUDPRead:=nil;
audiorecord.startRecording;
SendThread:=TSendThread.Create;
end
else begin
Circle.Fill.Color:=TAlphaColors.Gray;
audiorecord.stop;
Server.OnUDPRead:=ServerUDPRead;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
buffer_size:=2048; freq:=8000; port:=5555;
Server:=TIdUdpServer.Create(Form1);
with Server do begin
BufferSize:=buffer_size;
DefaultPort:=port;
BroadCastEnabled:=true;
Active:=true;
OnUDPRead:=ServerUDPRead;
end;
Circle.Width:=min(Screen.Width,Screen.Height)*0.7;
Circle.Height:=Circle.Width;
ch_in:=TJAudioFormat.JavaClass.CHANNEL_IN_MONO;
ch_out:=TJAudioFormat.JavaClass.CHANNEL_OUT_MONO;
format:=TJAudioFormat.JavaClass.ENCODING_PCM_16BIT;
source:=TJMediaRecorder_AudioSource.JavaClass.MIC;
audioRecord := TJAudioRecord.JavaClass.init(source, freq, ch_in, format, buffer_size);
audiotrack:=TJAudioTrack.JavaClass.init(3, freq, ch_out, format, buffer_size,1);
end;
procedure TForm1.ServerUDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle);
begin
audiotrack.write(TBytesToTJavaArray(TBytes(AData)),0,Length(AData));
audiotrack.play;
end;
end.
radio.zip
У нас при масштабировании одного проекта сталкивались со следующим:
- на устройствах отсутствовали Google Maps Service (или что-то в это духе)
- сервис режима энергосбережения тушил сервис Google Maps Service (или что-то в это духе)