跨平台的 IP取得 |
答題得分者是:P.D.
|
boy330077
一般會員 發表:39 回覆:59 積分:19 註冊:2009-10-15 發送簡訊給我 |
參考這邊
http://www.cnblogs.com/onechen/p/3627942.html 這邊寫的是 跨平台的 版本取得 事情是這樣的,某天我在網路上找到 已IDIPWATCH取得IPadress 的資料 WINDOWS下沒問題 RUN到手機上 就取不到IP了,找了很久都沒有 android 跟 idipwatch 的訊息 於是乎嘗試 網路上教的 JWifiManager 在手機上也成功取得 正確的IP位置 我開始想嘗試 像上方連結處,想要把它整合在一起 就變成以下 [code delphi] unit MyInternet; interface uses {$IFDEF ANDROID} Androidapi.JNI.JavaTypes, Androidapi.Jni.Net.Wifi, Androidapi.Helpers, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNIBridge, {$ENDIF} {$IFDEF MSWINDOWS} IdIPWatch, {$ENDIF} System.SysUtils; function GetLocalIP: String; implementation function GetLocalIP: String; {$IFDEF ANDROID} var WifiManagerObj: JObject; WifiManager: JWifiManager; WifiInfo: JWifiInfo; ip:integer; {$ENDIF} begin Result := '127.0.0.1'; {$IFDEF ANDROID} try WifiManagerObj := SharedActivityContext.getSystemService(TJContext.JavaClass.WIFI_SERVICE); WifiManager := TJWifiManager.Wrap((WifiManagerObj as ILocalObject).GetObjectID); WifiInfo := WifiManager.getConnectionInfo(); ip:=WifiInfo.getIpAddress; Result:=Format('%d.%d.%d.%d', [ip and $FF, (ip shr 8) and $FF, (ip shr 16)and $FF, (ip shr 24)and $FF]); finally end; {$ENDIF} {$IFDEF MSWINDOWS} with TIdIPWatch.Create(nil) do begin try HistoryEnabled := FALSE; Active := TRUE; if ForceCheck then begin Result := LocalIP; end; Active := FALSE; finally Free; end; end; {$ENDIF} end; end. [/code] 但是 手機上沒有問題 選擇 WIN 時 就一直跳出錯誤 說 JNIBrdge.dcu 找不到 我以為 我這樣寫 他因該不會需要這個檔案才對, 是不是我哪裡誤會了???? 或著 有更簡單的 跨平台取IP方式(原生 or 人家寫好的) Q2,中間 {$IFDEF ANDROID} 裡面 我用了個 try 中間取得的這些 WifiManagerObj 、WifiManager 不知道算不算 create? 我在 finally 的地方 不知道是不是該 free 或是其他的??? |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
你po阿卍的網址, 與後面要討論的, 前言不對後語, 不知用意為何
1. 除錯的方式, 你先把 相關 android 的都先移除掉, 只保留window的部份, 然後刪除所有dcu 再看會不會 2. 下了 ifdef , 我懷疑你編譯前並沒有把 platform由 andorid 切換到 windows, 導致它仍然以andoird 處理, 因為我按你的內容以 Multi Device Application 方式來做 在windows 下並沒有你提的問題 另外, 如果你想避免錯誤引發中斷, 應該使用 try except end , 而不是 finally 而 IdIpWatch 有支援 windows, andorid ios , 其實並不需要用 ifdef 來定義 windows, 我用的是xe8 這是我實作的內容 unit Unit3; 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, IdBaseComponent, IdComponent, IdIPWatch {$IFDEF ANDROID} Androidapi.JNI.JavaTypes, Androidapi.Jni.Net.Wifi, Androidapi.Helpers, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNIBridge {$ENDIF} ; type TForm3 = class(TForm) Button1: TButton; IdIPWatch1: TIdIPWatch; Label1: TLabel; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form3: TForm3; implementation {$R *.fmx} procedure TForm3.Button1Click(Sender: TObject); {$IFDEF ANDROID} var WifiManagerObj: JObject; WifiManager: JWifiManager; WifiInfo: JWifiInfo; ip:integer; {$ENDIF} begin {$IFDEF ANDROID} try WifiManagerObj := SharedActivityContext.getSystemService(TJContext.JavaClass.WIFI_SERVICE); WifiManager := TJWifiManager.Wrap((WifiManagerObj as ILocalObject).GetObjectID); WifiInfo := WifiManager.getConnectionInfo(); ip:=WifiInfo.getIpAddress; Label1.Text:=Format('%d.%d.%d.%d', [ip and $FF, (ip shr 8) and $FF, (ip shr 16)and $FF, (ip shr 24)and $FF]); except end; {$ENDIF} {$IFDEF MSWINDOWS} with TIdIPWatch.Create(nil) do begin try HistoryEnabled := FALSE; Active := TRUE; if ForceCheck then begin Label1.Text := LocalIP; end; Active := FALSE; finally Free; end; end; {$ENDIF} end; end.
編輯記錄
P.D. 重新編輯於 2015-06-12 09:10:14, 註解 無‧
|
boy330077
一般會員 發表:39 回覆:59 積分:19 註冊:2009-10-15 發送簡訊給我 |
抱歉
網址的用意,只是想說 我再學這用 "{$ IFDEF ANDROID}" <<類似這樣的東西 確實沒有太大意義 抱歉 至於 所謂的 platform 因該是 IDE 右方 什麼Target Plaforms 從我的手機 改成 在 WIN32點兩下 讓WIN32 變粗體 我有做到 但是您指的是不是這個我不清楚 try 的部分 我不是要抓例外,我只是想做到類似 A.Create try ..... finally A.Free end 之類的效果, 但是我不知道 WifiManagerObj 、WifiManager 這種東西 是不是需要 Free Close 或是 release 之類的 |
boy330077
一般會員 發表:39 回覆:59 積分:19 註冊:2009-10-15 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |