デフォルトのポートとブロードキャストモードが有効になっているフォームセットアップに TIdUDPServer があり、Android で何も受信できません。
iOS では同じコードが正常に動作しますが、Android をリターゲットしても何も表示されません。
私が見逃しているトリックはありますか?「ユーザー権限」を確認し、これに影響を与える可能性があると思われるものをすべてオンにしましたが、機能させることができませんでした。
前もってありがとう、マーティン
デフォルトのポートとブロードキャストモードが有効になっているフォームセットアップに TIdUDPServer があり、Android で何も受信できません。
iOS では同じコードが正常に動作しますが、Android をリターゲットしても何も表示されません。
私が見逃しているトリックはありますか?「ユーザー権限」を確認し、これに影響を与える可能性があると思われるものをすべてオンにしましたが、機能させることができませんでした。
前もってありがとう、マーティン
デバイスは WiFi またはモバイル ネットワークに接続されていますか? 最初に発信 UDP 接続を開始してモバイルの通信事業者のファイアウォールを開かない限り、UDP はモバイル上では機能しません。
UDP パケットは、デバイスの IP またはブロードキャスト IP に直接送信されていますか? デフォルトでは、Android はデバイスの IP に直接アドレス指定されていない UDP パケットを破棄します。マルチキャスト パケットの場合、そのWifiManager.createMulticastLock()
ようなパケットを許可するために事前に呼び出されている必要がありCHANGE_WIFI_MULTICAST_STATE
、アプリのマニフェストにアクセス許可を含める必要があります。それはUDPブロードキャストにも当てはまるかもしれませんが、私にはわかりません。
私を正しい軌道に乗せてくれてありがとう、レミー。ブロードキャストUDPパケットを受信するための完全なコードは次のとおりです...
unit Androidapi.JNI.WiFiManager;
interface
uses
Androidapi.JNIBridge, Androidapi.Jni, androidapi.JNI.JavaTypes, androidapi.JNI.Net,
androidapi.JNI.Os, FMX.Helpers.Android, Androidapi.JNI.GraphicsContentViewText, SysUtils;
Type
JWiFiManager = interface; // android/net/wifi/WifiManager
JMulticastLock = interface; // android/net/wifi/WifiManager$MulticastLock
JWiFiManagerClass = interface(JObjectClass)
['{F69F53AE-BC63-436A-8F69-57389B30CAA8}']
function getSystemService(Contex: JString): JWiFiManager; cdecl;
end;
[JavaSignature('android/net/wifi/WifiManager')]
JWiFiManager = interface(JObject)
['{382E85F2-6BF8-4255-BA3C-03C696AA6450}']
function createMulticastLock(tag: JString): JMulticastLock;
end;
TJWiFiManager = class(TJavaGenericImport<JWiFiManagerClass, JWiFiManager>) end;
JMulticastLockClass = interface(JObjectClass)
['{C0546633-3DF2-46B0-8E2C-C14411674A6F}']
end;
[JavaSignature('android/net/wifi/WifiManager$MulticastLock')]
JMulticastLock = interface(JObject)
['{CFA00D0C-097C-45E3-8B33-0E5A6C9FB9F1}']
procedure acquire();
function isHeld(): Boolean;
procedure release();
procedure setReferenceCounted(refCounted: boolean);
end;
TJMulticastLock = class(TJavaGenericImport<JMulticastLockClass, JMulticastLock>) end;
function GetWiFiManager: JWiFiManager;
implementation
function GetWiFiManager: JWiFiManager;
var
Obj: JObject;
begin
Obj := SharedActivityContext.getSystemService(TJContext.JavaClass.WIFI_SERVICE);
if not Assigned(Obj) then
raise Exception.Create('Could not locate Wifi Service');
Result := TJWiFiManager.Wrap((Obj as ILocalObject).GetObjectID);
if not Assigned(Result) then
raise Exception.Create('Could not access Wifi Manager');
end;
そして、必要なロックを取得するには...
wifi_manager := GetWiFiManager;
multiCastLock := wifi_manager.createMulticastLock(StringToJString('LightFactory Remote'));
multiCastLock.setReferenceCounted(true);
multiCastLock.acquire;
最後に、Remy の投稿に記載されているアクセス許可を忘れないでください。